Search the Community
Showing results for tags 'mouse hook'.
-
Regarding mouse hooks, how many can i have?
careca posted a topic in AutoIt General Help and Support
Hi, so i got this code to detect mouse wheel movement, and i noticed that if i have it running in some application, and then try to use it elsewhere, previous one will stop working. Any way to use it on multiple scripts? #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <WinAPI.au3> Global Const $MSLLHOOKSTRUCT = $tagPOINT & ";dword mouseData" $hKey_Proc = DllCallbackRegister("_Mouse_Proc", "int", "int;ptr;ptr") $hM_Module = DllCall("kernel32.dll", "hwnd", "GetModuleHandle", "ptr", 0) $hM_Hook = DllCall("user32.dll", "hwnd", "SetWindowsHookEx", "int", $WH_MOUSE_LL, "ptr", DllCallbackGetPtr($hKey_Proc), "hwnd", $hM_Module[0], "dword", 0) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE OnAutoItExit() Exit EndSwitch $hM_Hook = DllCall("user32.dll", "hwnd", "SetWindowsHookEx", "int", $WH_MOUSE_LL, "ptr", DllCallbackGetPtr($hKey_Proc), "hwnd", $hM_Module[0], "dword", 0) Sleep(100) WEnd Func _Mouse_Proc($nCode, $wParam, $lParam) Local $info, $mouseData $info = DllStructCreate($MSLLHOOKSTRUCT, $lParam) $mouseData = DllStructGetData($info, 3) Select Case $wParam = $WM_MOUSEWHEEL If _WinAPI_HiWord($mouseData) > 0 Then ConsoleWrite(' - Up - '&@CRLF) ToolTip('Up') Else ConsoleWrite(' - Down - '&@CRLF) ToolTip('Dn') EndIf EndSelect EndFunc ;==>_Mouse_Proc Func OnAutoItExit() DllCall("user32.dll", "int", "UnhookWindowsHookEx", "hwnd", $hM_Hook[0]) $hM_Hook[0] = 0 DllCallbackFree($hKey_Proc) $hKey_Proc = 0 EndFunc ;==>OnAutoItExit -
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. #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.
-
I had created a hook to get the values of the mouse wheel and button a while back, but have recently wanted more from this small function. I wanted to be able to disable or reroute mouse events by simply placing values into variables, without the need for calling functions. The following is the result. #cs MOUSE HOOK This function hooks, (captures), all mouse events and can programmatically disable or redirect them to other functions. Call MWHL_INIT() to initialize. The following variables either offer information or control the flow of mouse events: $MWHL = Wheel turned up or down, (1=up, -1=down, 0=idle) $MBUT = Middle Button, (1=click, 0=not) $BM, (Block Mouse), variables disable or control flow. By making them 1, they will disable an event, (ie. $BMMM=1 disables all Mouse Movement). By placing a function name in them, you can redirect the event to a function, (ie. $BMRD="CapRite" captures the right mouse button and sends it to the CapRite() function): $BMMM = Mouse Move $BMLD = Left Down $BMLU = Left Up $BMRD = Right Down $BMRD = Right Up $BMMD = Middle Down $BMMU = Middle Up $BMMS = Middle Scroll Be sure to set $BM variables to zero to re-enable normal functioning. Finally, to disable the hook, call MWHL(-1,-1,-1). #ce Func MWHL_INIT() Global $MWHL,$BMMS=0,$BMLD=0,$BMLU=0, $BMRD=0, $BMRU=0, $BMMD=0,$BMMU=0,$BMMM=0,$MBUT,$mwhl_call=DllCall("kernel32.dll","hwnd","GetModuleHandle","ptr",0),$mwhl_back=DllCall("user32.dll","hwnd","SetWindowsHookEx","int",14,"ptr",DllCallbackGetPtr(DllCallbackRegister("MWHL","int","hwnd;uint;long")),"hwnd",$mwhl_call[0],"dword",0),$MVAR[12]=["","$BMMM","$BMLD","$BMLU","","$BMRD","$BMRU","","$BMMD","$BMMU","","$BMMS"] EndFunc Func MWHL($h,$m,$l) If $h=-1 AND $m=-1 AND $l=-1 Then Return DllCall("user32.dll", "int", "UnhookWindowsHookEx", "hwnd", $mwhl_back[0]) Global $MWHL=BitShift(DllStructGetData(DllStructCreate("int X;int Y;dword mouseData",$l),3),16)/120, $MBUT=($m=0x208),$MEVENT=BitAND($m, 0xFFFF) If $MEVENT<512 OR $MEVENT>522 Then Return Local $MV=Execute($MVAR[$MEVENT-511]) If IsString($MV) Then Call($MV) Return 1 EndIf Return $MV EndFunc I have tested this a fair amount and then searched the forum for anything just like this, and yes, I know there are other mouse hooks out there, but one of them doesn't seem to get the direction of the mouse wheel, and I just like the simplicity of this one. It's format may seem a bit tight, but I love things that have a lot of power and occupy a little space. Hope someone finds it useful. Cheers, EDIT: BTW, yes, I know I didn't change the names of the calls from my old, original post, but I felt a bit nostalgic about the original functions and decided to leave their names as they are. If you like, change them to whatever you want. *Formatting care of "BrewManNH" Limited. For all your code formatting needs, call BrewManNH's.