Что нового

[Баг] Opt("GUICloseOnESC", 0) блокирует возможность закрытия окна с WinClose

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Очень важная бага для тех, кто использует данную опцию в своих скриптах.

Пример воспроизведения баги:

Код:
#include <GUIConstantsEx.au3>

Opt("GUICloseOnESC", 0)

$hGUI = GUICreate("Test Script", 300, 200)

GUISetState(@SW_SHOW, $hGUI)

WinClose($hGUI)
WinKill($hGUI)

While GUIGetMsg() <> $GUI_EVENT_CLOSE
WEnd


WinClose и WinKill не справляются с задачей, стоит только закоментировать Opt"GUICloseOnESC", 0) или выставить там 1, и всё будет нормально (скрипт завершит свою работу сразу после отображения).

А теперь объясню почему эта бага важна.
Если у вас установлена данная опция, и в скрипте вы пытаетесь закрыть одно из окон GUI (например внешним процессом, или при запуске с ком. строки), то скрипт не будет работать как ожидалось, и понять в чём дело будет непросто (я сам пару раз с этим сталкивался).

Однако есть решение данной проблеме, и кстати, тикет создавать смысла нет, т.к Valik сказал что бага не будет пофиксена пока не будет переработан весь механизм GUI, а это видимо, будет(?) не скоро.

А решений есть два...

1-вое, послать окну сочетание клавиш ALT + F4:
Код:
ControlSend($hGUI, "", "", "!{F4}")


и 2-ое, улавливать сообщение WM_CLOSE (это решение более правильное, т.к позволяет обойти багу при попытке закрытия окна внешними приложениями):

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt("GUICloseOnESC", 0)

$hGUI = GUICreate("Test Script", 300, 200)

GUISetState(@SW_SHOW, $hGUI)
GUIRegisterMsg($WM_CLOSE, "WM_CLOSE")

WinClose($hGUI)

While GUIGetMsg() <> $GUI_EVENT_CLOSE
WEnd

Func WM_CLOSE($hWnd, $nMsg, $lParam, $wParam)
	Exit
EndFunc


P.S
Как видно из примера выше, при GUICloseOnESC = 0 сообщение WM_CLOSE удачно обрабатывается, поэтому бага видимо заключается в GUIGetMsg (а точнее во всём механизме обработчика событий, т.к в режиме OnEvent бага тоже проявляется).
 
Верх