- Сообщения
- 8,673
- Репутация
- 2,486
Очень важная бага для тех, кто использует данную опцию в своих скриптах.
Пример воспроизведения баги:
WinClose и WinKill не справляются с задачей, стоит только закоментировать Opt"GUICloseOnESC", 0) или выставить там 1, и всё будет нормально (скрипт завершит свою работу сразу после отображения).
А теперь объясню почему эта бага важна.
Если у вас установлена данная опция, и в скрипте вы пытаетесь закрыть одно из окон GUI (например внешним процессом, или при запуске с ком. строки), то скрипт не будет работать как ожидалось, и понять в чём дело будет непросто (я сам пару раз с этим сталкивался).
Однако есть решение данной проблеме, и кстати, тикет создавать смысла нет, т.к Valik сказал что бага не будет пофиксена пока не будет переработан весь механизм GUI, а это видимо, будет(?) не скоро.
А решений есть два...
1-вое, послать окну сочетание клавиш ALT + F4:
и 2-ое, улавливать сообщение WM_CLOSE (это решение более правильное, т.к позволяет обойти багу при попытке закрытия окна внешними приложениями):
P.S
Как видно из примера выше, при GUICloseOnESC = 0 сообщение WM_CLOSE удачно обрабатывается, поэтому бага видимо заключается в GUIGetMsg (а точнее во всём механизме обработчика событий, т.к в режиме OnEvent бага тоже проявляется).
Пример воспроизведения баги:
Код:
#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 бага тоже проявляется).