9 posts in this topic
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, "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, "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) $hM_Hook = 0 DllCallbackFree($hKey_Proc) $hKey_Proc = 0 EndFunc ;==>OnAutoItExit
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,"dword",0),$MVAR=["","$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) 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.
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.