Skitty Posted July 5, 2012 Posted July 5, 2012 (edited) So I was messing around with mouse hooks, seems to be a problem when you throw a GUI in the game and the script doesn't play well when its around. My problem is that the script will randomly crash upon exiting the app. Here's an example that replicates this behavior. expandcollapse popup#include <WinAPI.au3> AutoItSetOption("GUIOnEventMode", 1) Global $hMouseHook = -1 Global $hMouseProc = -1 Global $Mouse GUICreate("Test", 350, 300) GUISetBkColor(0) GUISetOnEvent(-3, "Terminate") OnAutoItExitRegister("Terminate") GUISetState() $Lable = GUICtrlCreateLabel("", 0, 0, 350, 300) GUICtrlSetFont(-1,225, 700) GUICtrlSetColor(-1, 0xFFFF00) _UI_SetMouseHook(1) For $I = 10 To 0 Step -1 GUICtrlSetData($Lable, $I) Sleep(1000) Next Exit Func Terminate() OnAutoItExitUnRegister("Terminate") _UI_SetMouseHook() Exit EndFunc Func _UI_SetMouseHook($DoWhat = 0) If Not IsDeclared("DoWhat") Then $Dowhat = 1 AdlibUnRegister("_UI_SetMouseHook") Switch $Dowhat Case 1 If $hMouseProc = -1 Then $hMouseProc = DllCallbackRegister("WM_MOUSEMOVE", "int", "uint;wparam;lparam") EndIf If $hMouseHook = -1 Then Local $hM_Module = _WinAPI_GetModuleHandle(0) $hMouseHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hMouseProc), $hM_Module, 0) EndIf Case 0 If $hMouseHook <> -1 Then _WinAPI_UnhookWindowsHookEx($hMouseHook) $hMouseHook = -1 EndIf If $hMouseProc <> -1 Then DllCallbackFree($hMouseProc) $hMouseProc = -1 EndIf EndSwitch EndFunc Func WM_MOUSEMOVE($nCode, $wParam, $lParam) #forceref $nCode, $wParam, $lParam If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hMouseHook, $nCode, $wParam, $lParam) ;Continue processing EndIf Switch BitAND($wParam, 0xFFFF) Case 513 Beep(800, 1) Case 514; mouse up Beep(5000, 1) Case 512; mouse moving $Mouse = MouseGetPos() ToolTip($Mouse[0] & "x" & $Mouse[1]) EndSwitch Return _WinAPI_CallNextHookEx($hMouseHook, $nCode, $wParam, $lParam) ;Continue processing EndFunc ;==>WM_MOUSEMOVE I got the code from MrCreatoR and his MouseOnEvent UDF, it's basically a stripped down version of his UDF. Also, take not of how the script seems to lag when clicking any of the command buttons. Edited July 5, 2012 by ApudAngelorum
AZJIO Posted July 5, 2012 Posted July 5, 2012 (edited) ApudAngelorumHook_MOUSEHook_KEYBOARFor $I = 3 To 1 Step -1 GUICtrlSetData($Lable, $I) Sleep(1000) Next OnAutoItExitUnregister("Terminate") _UI_SetMouseHook() Exit Edited July 5, 2012 by AZJIO My other projects or all
Skitty Posted July 5, 2012 Author Posted July 5, 2012 ApudAngelorum Hook_MOUSE Hook_KEYBOAR For $I = 3 To 1 Step -1 GUICtrlSetData($Lable, $I) Sleep(1000) Next OnAutoItExitUnregister("Terminate") _UI_SetMouseHook() Exit Ok, so this narrows it down to the real problem now. expandcollapse popup#include #include ; #include Global $hMouseHook, $hStub_KeyProc, $iEditLog, $Gui ;Global Const $WM_MBUTTONDBLCLK = 0x0209 ;Global Const $WM_RBUTTONDBLCLK = 0x0206 ; Global Const $WM_MOUSEHWHEEL = 0x020E ??? AutoItSetOption("GUIOnEventMode", 1) _Main() Func _Main() OnAutoItExitRegister("Cleanup") Local $hmod $hStub_KeyProc = DllCallbackRegister("WM_MOUSEMOVE", "long", "int;wparam;lparam") $hmod = _WinAPI_GetModuleHandle(0) $hMouseHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod) ; Esc - ??? ???????? ??????? $Gui=GUICreate('?????? ????????? ? ?????? ????', 700, 260, -1 , -1) GUISetOnEvent(-3, "Cleanup") $iEdit = GUICtrlCreateEdit('', 5, 5, 290, 250) $iEditLog = GUICtrlCreateEdit('', 300, 5, 390, 250) GUISetState() Sleep(999999) EndFunc ;=========================================================== ; callback function ;=========================================================== Func WM_MOUSEMOVE($nCode, $wParam, $lParam) #forceref $nCode, $wParam, $lParam If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hMouseHook, $nCode, $wParam, $lParam) ;Continue processing EndIf Switch $wParam Case $WM_LBUTTONDOWN Beep(800, 1) Case $WM_LBUTTONUP; mouse up Beep(5000, 1) Case Else; mouse moving Local $tMOUSE = DllStructCreate("uint x;uint y", $lParam) ToolTip(DllStructGetData($tMOUSE, "x") & "x" & DllStructGetData($tMOUSE, "y")) EndSwitch Return ;_WinAPI_CallNextHookEx($hMouseHook, $nCode, $wParam, $lParam) ;Continue processing EndFunc ;==>WM_MOUSEMOVE Func Cleanup() _WinAPI_UnhookWindowsHookEx($hMouseHook) DllCallbackFree($hStub_KeyProc) Exit EndFunc Obviously the problem is when GuiOnEventMode is active.
Skitty Posted July 5, 2012 Author Posted July 5, 2012 Confirmed, the issue is due to some internal autoit conflict which maybe only the devs would know why. Everything works flawlessly when "guioneventmode" is set to default. All I had to do was rewrite the script to not use control events and manage everything through wm notify, comman and syscommand and the script no longer crashes, but there still is a short lag when clicking a title bar button. http://www.autoitscript.com/forum/topic/96829-solved-how-to-detect-gui-close/#entry698605 Func WM_SYSCOMMAND($hWnd, $iMsg, $iwParam, $ilParam) #forceref $hWnd, $iMsg, $iwParam, $ilParam Switch BitAND($iwParam, 0xFFF0) Case $SC_MOVE ConsoleWrite("WM_Move" & @CR) Case $SC_SIZE ConsoleWrite("WM_Size" & @CR) Case $SC_MINIMIZE ConsoleWrite("WM_Minimize" & @CR) Case $SC_MAXIMIZE ConsoleWrite("WM_Maximize" & @CR) Case $SC_RESTORE ConsoleWrite("WM_Restore" & @CR) Case $SC_CLOSE ConsoleWrite("WM_Close" & @CR) _UI_Terminate() EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_SYSCOMMAND
AZJIO Posted July 5, 2012 Posted July 5, 2012 You 2 times to call the same function. I seem to be offered to add this in the help fileOnAutoItExitRegister("Cleanup") GUISetOnEvent(-3, "Cleanup")#include <GUIConstantsEx.au3> OnAutoItExitRegister("_Exit") Opt("GUIOnEventMode", 1) $hGui = GUICreate('My Program', 250, 260) GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit") GUISetState() While 1 Sleep(1000) WEnd Func _Exit() MsgBox(64+4096, "<img src='http://www.autoitscript.com/forum/public/style_emoticons/<#EMO_DIR#>/smile.png' class='bbc_emoticon' alt=':)' />", 'Exit?') Exit EndFunc My other projects or all
Skitty Posted July 5, 2012 Author Posted July 5, 2012 You 2 times to call the same function. I seem to be offered to add this in the help file OnAutoItExitRegister("Cleanup") GUISetOnEvent(-3, "Cleanup") #include <GUIConstantsEx.au3> OnAutoItExitRegister("_Exit") Opt("GUIOnEventMode", 1) $hGui = GUICreate('My Program', 250, 260) GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit") GUISetState() While 1 Sleep(1000) WEnd Func _Exit() MsgBox(64+4096, "<img src='http://www.autoitscript.com/forum/public/style_emoticons/<#EMO_DIR#>/smile.png' class='bbc_emoticon' alt=':)' />", 'Exit?') Exit EndFunc Yes, I notice the function gets called twice, in the original script I posted you will notice I unset the on exit function to prevent it being called a second time. I did not do it to the second modified example of my issue because it was not something that is overly significant. But for what it's worth, here is the method I'm using now to avoid the phenomena my initial script was displaying. expandcollapse popup#include <WinAPI.au3> #include <WindowsConstants.au3> #include <MenuConstants.au3> #include <GUIConstantsEx.au3> Global $hMouseHook = -1 Global $hMouseProc = -1 Global $Mouse _UI_SetMouseHook(1) GUICreate("Test", 350, 300) GUISetBkColor(0) GUISetOnEvent(-3, "Terminate") OnAutoItExitRegister("Terminate") GUISetState() GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND") $Lable = GUICtrlCreateLabel("", 0, 0, 350, 300) GUICtrlSetFont(-1,225, 700) GUICtrlSetColor(-1, 0xFFFF00) For $I = 10 To 1 Step -1 GUICtrlSetData($Lable, $I) Sleep(1000) Next Exit Func Terminate() OnAutoItExitUnRegister("Terminate") _UI_SetMouseHook() Exit EndFunc Func _UI_SetMouseHook($DoWhat = 0) If Not IsDeclared("DoWhat") Then $Dowhat = 1 Switch $Dowhat Case 1 If $hMouseProc = -1 Then $hMouseProc = DllCallbackRegister("WM_MOUSEMOVE", "long", "int;wparam;lparam") EndIf If $hMouseHook = -1 Then Local $hM_Module = _WinAPI_GetModuleHandle(0) $hMouseHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hMouseProc), $hM_Module) EndIf Case 0 If $hMouseHook <> -1 Then _WinAPI_UnhookWindowsHookEx($hMouseHook) $hMouseHook = -1 EndIf If $hMouseProc <> -1 Then DllCallbackFree($hMouseProc) $hMouseProc = -1 EndIf EndSwitch EndFunc Func WM_MOUSEMOVE($nCode, $wParam, $lParam) #forceref $nCode, $wParam, $lParam If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hMouseHook, $nCode, $wParam, $lParam) ;Continue processing EndIf Switch $wParam Case $WM_LBUTTONDOWN Beep(800, 1) Case $WM_LBUTTONUP; mouse up Beep(5000, 1) Case Else; mouse moving Local $tMOUSE = DllStructCreate("uint x;uint y", $lParam) ToolTip(DllStructGetData($tMOUSE, "x") & "x" & DllStructGetData($tMOUSE, "y")) EndSwitch Return ;_WinAPI_CallNextHookEx($hMouseHook, $nCode, $wParam, $lParam) ;Continue processing EndFunc ;==>WM_MOUSEMOVE Func WM_SYSCOMMAND($hWnd, $iMsg, $iwParam, $ilParam) #forceref $hWnd, $iMsg, $iwParam, $ilParam Switch BitAND($iwParam, 0xFFF0) Case $SC_MOVE ConsoleWrite("WM_Move" & @CR) Case $SC_SIZE ConsoleWrite("WM_Size" & @CR) Case $SC_MINIMIZE ConsoleWrite("WM_Minimize" & @CR) Case $SC_MAXIMIZE ConsoleWrite("WM_Maximize" & @CR) Case $SC_RESTORE ConsoleWrite("WM_Restore" & @CR) Case $SC_CLOSE ConsoleWrite("WM_Close" & @CR) Terminate() Case $SC_SCREENSAVE ConsoleWrite("SC_SCREENSAVE" & @CR) EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_SYSCOMMAND
AZJIO Posted July 5, 2012 Posted July 5, 2012 expandcollapse popup#include <WinAPI.au3> #include <WindowsConstants.au3> #include <MenuConstants.au3> #include <GUIConstantsEx.au3> Global $hMouseHook = -1 Global $hMouseProc = -1 Global $Mouse _UI_SetMouseHook(1) GUICreate("Test", 350, 300) GUISetBkColor(0) OnAutoItExitRegister("Terminate") GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND") $Lable = GUICtrlCreateLabel("", 0, 0, 350, 300) GUICtrlSetFont(-1,225, 700) GUICtrlSetColor(-1, 0xFFFF00) GUISetState() For $I = 3 To 1 Step -1 GUICtrlSetData($Lable, $I) Sleep(1000) Next Exit Func Terminate() _UI_SetMouseHook() Exit EndFunc Func _UI_SetMouseHook($DoWhat = 0) If Not IsDeclared("DoWhat") Then $Dowhat = 1 Switch $Dowhat Case 1 If $hMouseProc = -1 Then $hMouseProc = DllCallbackRegister("WM_MOUSEMOVE", "long", "int;wparam;lparam") EndIf If $hMouseHook = -1 Then Local $hM_Module = _WinAPI_GetModuleHandle(0) $hMouseHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hMouseProc), $hM_Module) EndIf Case 0 If $hMouseHook <> -1 Then _WinAPI_UnhookWindowsHookEx($hMouseHook) $hMouseHook = -1 EndIf If $hMouseProc <> -1 Then DllCallbackFree($hMouseProc) $hMouseProc = -1 EndIf EndSwitch EndFunc Func WM_MOUSEMOVE($nCode, $wParam, $lParam) #forceref $nCode, $wParam, $lParam If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hMouseHook, $nCode, $wParam, $lParam) ;Continue processing EndIf Switch $wParam Case $WM_LBUTTONDOWN Beep(800, 1) Case $WM_LBUTTONUP; mouse up Beep(5000, 1) Case Else; mouse moving Local $tMOUSE = DllStructCreate("uint x;uint y", $lParam) ToolTip(DllStructGetData($tMOUSE, "x") & "x" & DllStructGetData($tMOUSE, "y")) EndSwitch Return ;_WinAPI_CallNextHookEx($hMouseHook, $nCode, $wParam, $lParam) ;Continue processing EndFunc ;==>WM_MOUSEMOVE Func WM_SYSCOMMAND($hWnd, $iMsg, $iwParam, $ilParam) #forceref $hWnd, $iMsg, $iwParam, $ilParam Switch BitAND($iwParam, 0xFFF0) Case $SC_MOVE ConsoleWrite("WM_Move" & @CR) Case $SC_SIZE ConsoleWrite("WM_Size" & @CR) Case $SC_MINIMIZE ConsoleWrite("WM_Minimize" & @CR) Case $SC_MAXIMIZE ConsoleWrite("WM_Maximize" & @CR) Case $SC_RESTORE ConsoleWrite("WM_Restore" & @CR) Case $SC_CLOSE ConsoleWrite("WM_Close" & @CR) Terminate() Case $SC_SCREENSAVE ConsoleWrite("SC_SCREENSAVE" & @CR) EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_SYSCOMMAND My other projects or all
Skitty Posted July 5, 2012 Author Posted July 5, 2012 (edited) expandcollapse popup#include <WinAPI.au3> #include <WindowsConstants.au3> #include <MenuConstants.au3> #include <GUIConstantsEx.au3> Global $hMouseHook = -1 Global $hMouseProc = -1 Global $Mouse _UI_SetMouseHook(1) GUICreate("Test", 350, 300) GUISetBkColor(0) OnAutoItExitRegister("Terminate") GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND") $Lable = GUICtrlCreateLabel("", 0, 0, 350, 300) GUICtrlSetFont(-1,225, 700) GUICtrlSetColor(-1, 0xFFFF00) GUISetState() For $I = 3 To 1 Step -1 GUICtrlSetData($Lable, $I) Sleep(1000) Next Exit Func Terminate() _UI_SetMouseHook() Exit EndFunc Func _UI_SetMouseHook($DoWhat = 0) If Not IsDeclared("DoWhat") Then $Dowhat = 1 Switch $Dowhat Case 1 If $hMouseProc = -1 Then $hMouseProc = DllCallbackRegister("WM_MOUSEMOVE", "long", "int;wparam;lparam") EndIf If $hMouseHook = -1 Then Local $hM_Module = _WinAPI_GetModuleHandle(0) $hMouseHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hMouseProc), $hM_Module) EndIf Case 0 If $hMouseHook <> -1 Then _WinAPI_UnhookWindowsHookEx($hMouseHook) $hMouseHook = -1 EndIf If $hMouseProc <> -1 Then DllCallbackFree($hMouseProc) $hMouseProc = -1 EndIf EndSwitch EndFunc Func WM_MOUSEMOVE($nCode, $wParam, $lParam) #forceref $nCode, $wParam, $lParam If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hMouseHook, $nCode, $wParam, $lParam) ;Continue processing EndIf Switch $wParam Case $WM_LBUTTONDOWN Beep(800, 1) Case $WM_LBUTTONUP; mouse up Beep(5000, 1) Case Else; mouse moving Local $tMOUSE = DllStructCreate("uint x;uint y", $lParam) ToolTip(DllStructGetData($tMOUSE, "x") & "x" & DllStructGetData($tMOUSE, "y")) EndSwitch Return ;_WinAPI_CallNextHookEx($hMouseHook, $nCode, $wParam, $lParam) ;Continue processing EndFunc ;==>WM_MOUSEMOVE Func WM_SYSCOMMAND($hWnd, $iMsg, $iwParam, $ilParam) #forceref $hWnd, $iMsg, $iwParam, $ilParam Switch BitAND($iwParam, 0xFFF0) Case $SC_MOVE ConsoleWrite("WM_Move" & @CR) Case $SC_SIZE ConsoleWrite("WM_Size" & @CR) Case $SC_MINIMIZE ConsoleWrite("WM_Minimize" & @CR) Case $SC_MAXIMIZE ConsoleWrite("WM_Maximize" & @CR) Case $SC_RESTORE ConsoleWrite("WM_Restore" & @CR) Case $SC_CLOSE ConsoleWrite("WM_Close" & @CR) Terminate() Case $SC_SCREENSAVE ConsoleWrite("SC_SCREENSAVE" & @CR) EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_SYSCOMMAND Yeah, that's what I meant to post I'm a little high right now, or a lot... Edited July 5, 2012 by ApudAngelorum
AZJIO Posted July 5, 2012 Posted July 5, 2012 expandcollapse popup#include <WinAPI.au3> #include <WindowsConstants.au3> #include <MenuConstants.au3> #include <GUIConstantsEx.au3> Global $hMouseHook = -1 Global $hMouseProc = -1 Global $Mouse _UI_SetMouseHook(1) GUICreate("Test", 350, 300) GUISetBkColor(0) ; GUISetOnEvent(-3, "_Exit") OnAutoItExitRegister("Terminate") GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND") $Lable = GUICtrlCreateLabel("", 0, 0, 350, 300) GUICtrlSetFont(-1,225, 700) GUICtrlSetColor(-1, 0xFFFF00) GUISetState() For $I = 13 To 1 Step -1 GUICtrlSetData($Lable, $I) Sleep(1000) Next Exit Func Terminate() _UI_SetMouseHook() EndFunc Func _Exit() Exit EndFunc Func _UI_SetMouseHook($DoWhat = 0) If Not IsDeclared("DoWhat") Then $Dowhat = 1 Switch $Dowhat Case 1 If $hMouseProc = -1 Then $hMouseProc = DllCallbackRegister("WM_MOUSEMOVE", "long", "int;wparam;lparam") EndIf If $hMouseHook = -1 Then Local $hM_Module = _WinAPI_GetModuleHandle(0) $hMouseHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hMouseProc), $hM_Module) EndIf Case 0 If $hMouseHook <> -1 Then _WinAPI_UnhookWindowsHookEx($hMouseHook) $hMouseHook = -1 EndIf If $hMouseProc <> -1 Then DllCallbackFree($hMouseProc) $hMouseProc = -1 EndIf EndSwitch EndFunc Func WM_MOUSEMOVE($nCode, $wParam, $lParam) #forceref $nCode, $wParam, $lParam If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hMouseHook, $nCode, $wParam, $lParam) ;Continue processing EndIf Switch $wParam Case $WM_LBUTTONDOWN Beep(800, 1) Case $WM_LBUTTONUP; mouse up Beep(5000, 1) Case Else; mouse moving Local $tMOUSE = DllStructCreate("uint x;uint y", $lParam) ToolTip(DllStructGetData($tMOUSE, "x") & "x" & DllStructGetData($tMOUSE, "y")) EndSwitch Return ;_WinAPI_CallNextHookEx($hMouseHook, $nCode, $wParam, $lParam) ;Continue processing EndFunc ;==>WM_MOUSEMOVE Func WM_SYSCOMMAND($hWnd, $iMsg, $iwParam, $ilParam) #forceref $hWnd, $iMsg, $iwParam, $ilParam Switch BitAND($iwParam, 0xFFF0) Case $SC_MOVE ConsoleWrite("WM_Move" & @CR) Case $SC_SIZE ConsoleWrite("WM_Size" & @CR) Case $SC_MINIMIZE ConsoleWrite("WM_Minimize" & @CR) Case $SC_MAXIMIZE ConsoleWrite("WM_Maximize" & @CR) Case $SC_RESTORE ConsoleWrite("WM_Restore" & @CR) Case $SC_CLOSE ConsoleWrite("WM_Close" & @CR) _Exit() Case $SC_SCREENSAVE ConsoleWrite("SC_SCREENSAVE" & @CR) EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_SYSCOMMAND My other projects or all
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now