#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
;These constants found in the helpfile under Windows Message Codes
;Global Const $WM_MOUSEMOVE = 0x0200 ;mouse move
;Global Const $WM_MOUSEWHEEL = 0x020A ;wheel up/down
;Global Const $WM_LBUTTONDOWN = 0x0201
;Global Const $WM_LBUTTONUP = 0x0202
;Global Const $WM_RBUTTONDOWN = 0x0204
;Global Const $WM_RBUTTONUP = 0x0205
;Global Const $WM_MBUTTONDOWN = 0x0207
;Global Const $WM_MBUTTONUP = 0x0208
Global Const $MSLLHOOKSTRUCT = $tagPOINT & ";dword mouseData;dword flags;dword time;ulong_ptr dwExtraInfo"
Global $currentEvent[2]
Global $iLBUTTONDOWN = 0
Global $iRBUTTONDOWN = 0
Global $iMBUTTONDOWN = 0
Global $LRClickStatus = 0
Global $RLClickStatus = 0
Global $LRDrag = 0
Global $RLDrag = 0
Global $LMDrag = 0
Global $RMDrag = 0
Global $doubleClickTime = 400
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 633, 447, 192, 124)
$Label1 = GUICtrlCreateLabel("Label1", 200, 8, 228, 49)
GUISetState(@SW_SHOW)
;Register callback
$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)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
OnAutoItExit()
Exit
EndSwitch
WEnd
Func _Mouse_Proc($nCode, $wParam, $lParam)
Local $info, $mouseData, $time, $timeDiff
If $nCode < 0 Then
$ret = DllCall("user32.dll", "long", "CallNextHookEx", "hwnd", $hM_Hook[0], _
"int", $nCode, "ptr", $wParam, "ptr", $lParam)
Return $ret[0]
EndIf
$info = DllStructCreate($MSLLHOOKSTRUCT, $lParam)
$mouseData = DllStructGetData($info, 3)
$time = DllStructGetData($info, 5)
$timeDiff = $time - $currentEvent[1]
Select
Case $wParam = $WM_MOUSEMOVE
;Test for Drag in here
If $currentEvent[0] <> "LDrag" Or $currentEvent[0] <> "LRDrag" Or $currentEvent[0] <> "LMDrag" Then
If $iLBUTTONDOWN = 1 Then
$currentEvent[0] = "LDrag"
If $iRBUTTONDOWN = 1 Then
$currentEvent[0] = "LRDrag"
$LRDrag = 2
EndIf
EndIf
EndIf
If $currentEvent[0] <> "RDrag" Or $currentEvent[0] <> "RMDrag" Or $currentEvent[0] <> "LRDrag" Then
If $iRBUTTONDOWN = 1 Then
$currentEvent[0] = "RDrag"
EndIf
EndIf
If $currentEvent[0] <> "MDrag" Then
If $iMBUTTONDOWN = 1 Then
$currentEvent[0] = "MDrag"
$currentEvent[1] = $time
EndIf
EndIf
If $iRBUTTONDOWN = 1 And $iMBUTTONDOWN = 1 And $currentEvent[0] <> "RMDrag" Then
$RMDrag = 2
$currentEvent[0] = "RMDrag"
$currentEvent[1] = $time
EndIf
If $iLBUTTONDOWN = 1 And $iMBUTTONDOWN = 1 And $currentEvent[0] <> "LMDrag" Then
$LMDrag = 2
$currentEvent[0] = "LMDrag"
$currentEvent[1] = $time
EndIf
Case $wParam = $WM_MOUSEWHEEL
If _WinAPI_HiWord($mouseData) > 0 Then
;Wheel Up
$currentEvent[0] = "WheelUp"
$currentEvent[1] = $time
Else
;Wheel Down
$currentEvent[0] = "WheelDown"
$currentEvent[1] = $time
EndIf
Case $wParam = $WM_LBUTTONDOWN
;Register Button Down, check for Right/Left
If $currentEvent[0] = "RClick" Then
$LRClickStatus = 1
EndIf
$iLBUTTONDOWN = 1
Case $wParam = $WM_LBUTTONUP
;Update $iLBUTTONDOWN
$iLBUTTONDOWN = 0
;Test for Right/Left Click
If $RLClickStatus = 1 And ($timeDiff) < $doubleClickTime Then
$currentEvent[0] = "RLClick"
$currentEvent[1] = $time
EndIf
If $currentEvent[0] = "LClick" And ($timeDiff) < $doubleClickTime Then
$currentEvent[0] = "LDClick"
$currentEvent[1] = $time
EndIf
;Test for Drops
If $currentEvent[0] = "LDrag" Then
$currentEvent[0] = "LDrop"
$currentEvent[1] = $time
EndIf
If $LRDrag = 2 And $iRBUTTONDOWN = 1 Then
$LRDrag = 1 ; Denote $LRDrag as still having one button clicked, need to register the drop on RButton up
EndIf
If $LRDrag = 1 And $iRBUTTONDOWN = 0 Then
$currentEvent[0] = "LRDrop"
$currentEvent[1] = $time
$LRDrag = 0
EndIf
If $LMDrag = 2 And $iMBUTTONDOWN = 1 Then
$LMDrag = 1 ; Denote $LMDrag as still having one button clicked, need to register the drop on MButton up
EndIf
If $LMDrag = 1 And $iMBUTTONDOWN = 0 Then
$currentEvent[0] = "LMDrop"
$currentEvent[1] = $time
$LMDrag = 0
EndIf
;Set LClick if other events haven't fired
If $currentEvent[1] <> $time Then
$currentEvent[0] = "LClick"
$currentEvent[1] = $time
EndIf
;Negate $LRClickStatus
$RLClickStatus = 0
Case $wParam = $WM_RBUTTONDOWN
;Register Button Down
If $currentEvent[0] = "LClick" Then
$RLClickStatus = 1
EndIf
$iRBUTTONDOWN = 1
Case $wParam = $WM_RBUTTONUP
;Test for Left, Right, and Right Doubleclick here
;Update $iRBUTTONDOWN
$iRBUTTONDOWN = 0
;Test for Right/Left Click
If $LRClickStatus = 1 And ($timeDiff) < $doubleClickTime Then
$currentEvent[0] = "LRClick"
$currentEvent[1] = $time
EndIf
If $currentEvent[0] = "RClick" And ($timeDiff) < $doubleClickTime Then
$currentEvent[0] = "RDClick"
$currentEvent[1] = $time
EndIf
;Test for Drops
If $currentEvent[0] = "RDrag" Then
$currentEvent[0] = "RDrop"
$currentEvent[1] = $time
EndIf
If $LRDrag = 2 And $iLBUTTONDOWN = 1 Then
$LRDrag = 1 ; Denote $LRDrag as still having one button clicked, need to register the drop on RButton up
EndIf
If $LRDrag = 1 And $iLBUTTONDOWN = 0 Then
$currentEvent[0] = "LRDrop"
$currentEvent[1] = $time
$LRDrag = 0
EndIf
If $RMDrag = 2 And $iMBUTTONDOWN = 1 Then
$RMDrag = 1 ; Denote $LMDrag as still having one button clicked, need to register the drop on MButton up
EndIf
If $RMDrag = 1 And $iMBUTTONDOWN = 0 Then
$currentEvent[0] = "RMDrop"
$currentEvent[1] = $time
$RMDrag = 0
EndIf
;Set LClick if other events haven't fired
If $currentEvent[1] <> $time Then
$currentEvent[0] = "RClick"
$currentEvent[1] = $time
EndIf
;Negate $LRClickStatus
$LRClickStatus = 0
Case $wParam = $WM_MBUTTONDOWN
;Register Button Down
$iMBUTTONDOWN = 1
Case $wParam = $WM_MBUTTONUP
;Test for Middle Double Click here
;Update $iRBUTTONDOWN
$iMBUTTONDOWN = 0
;Test for Right/Left Click
If $currentEvent[0] = "MClick" And ($timeDiff) < $doubleClickTime Then
$currentEvent[0] = "MDClick"
$currentEvent[1] = $time
EndIf
;Test for Drops
If $currentEvent[0] = "MDrag" Then
$currentEvent[0] = "MDrop"
$currentEvent[1] = $time
EndIf
If $LMDrag = 2 And $iLBUTTONDOWN = 1 Then
$LMDrag = 1 ; Denote $LRDrag as still having one button clicked, need to register the drop on RButton up
EndIf
If $LMDrag = 1 And $iLBUTTONDOWN = 0 Then
$currentEvent[0] = "LMDrop"
$currentEvent[1] = $time
$LMDrag = 0
EndIf
If $RMDrag = 2 And $iRBUTTONDOWN = 1 Then
$RMDrag = 1 ; Denote $LMDrag as still having one button clicked, need to register the drop on MButton up
EndIf
If $RMDrag = 1 And $iRBUTTONDOWN = 0 Then
$currentEvent[0] = "RMDrop"
$currentEvent[1] = $time
$RMDrag = 0
EndIf
;Set MClick if other events haven't fired
If $currentEvent[1] <> $time Then
$currentEvent[0] = "MClick"
$currentEvent[1] = $time
EndIf
Case Else
$currentEvent[0] = $wParam
EndSelect
GUICtrlSetData($Label1, $currentEvent[0] & @CRLF & $currentEvent[1])
$ret = DllCall("user32.dll", "long", "CallNextHookEx", "hwnd", $hM_Hook[0], _
"int", $nCode, "ptr", $wParam, "ptr", $lParam)
Return $ret[0]
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