Что нового

[Баг] Opt("GUICloseOnESC", 0) нарушает работу WinClose

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
Тикет уже создан, дублирую тут для того чтобы и русское сообщество знало об этом баге:

Код:
Opt("GUICloseOnESC", 0)

$sTitle = "Test WinClose()"

;Kill off any currently running version of this script
If WinExists($sTitle) Then
	If Not WinClose($sTitle) Then WinKill($sTitle)
	
	If WinExists($sTitle) Then
		MsgBox(0, "ERROR", "Cannot kill window")
	EndIf
EndIf

GUICreate($sTitle, 300, 200)
GUISetState()

Do
Until GUIGetMsg() = -3


Запустите скрипт дважды (не из SciTE естественно), ожидаемый результат это закрытие первой копии GUI при повторном запуске, на деле этого не происходит, а всему виной Opt("GUICloseOnESC", 0), стоит только установить эту опцию на 1, и всё будет работать как и ожидается.
 

SyDr

Сидра
Сообщения
651
Репутация
158
Ну и в придачу: такие окна не могут быть закрыты с использованием функции "Снять задачу" из диспетчера задач.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
В принципе это может быть и фича, типа защита от постороннего закрытия приложения.

Для отключения закрытия по ESC можно использовать GUISetAccelerators.

P.S
По всей видимости это не бага, и разработчики просто промахнулись с названием опций, на самом деле должно было быть так: Opt("GUIClose", 0)
 

SyDr

Сидра
Сообщения
651
Репутация
158
Не-не-не. В таком случае:
1) Неправильно не только название опции, но и её описание.
2) Как определить, что программу вообще пытаются закрыть?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Можно написать так:

Код:
#Include <WindowsConstants.au3>

Opt("GUICloseOnESC", 0)

$sTitle = "Test WinClose()"

;Kill off any currently running version of this script
If WinExists($sTitle) Then
    If Not WinClose($sTitle) Then WinKill($sTitle)

    If WinExists($sTitle) Then
        MsgBox(0, "ERROR", "Cannot kill window")
    EndIf
EndIf

GUICreate($sTitle, 300, 200)
GUIRegisterMsg($WM_CLOSE, "WM_CLOSE")
GUISetState()

Do
Until GUIGetMsg() = -3

Func WM_CLOSE($hWnd, $iMsg, $wParam, $lParam)
	Exit
EndFunc   ;==>WM_CLOSE
 
Верх