From fcb78f8fb5b94d234d6a8eb8a2ed6f937b95b0c7 Mon Sep 17 00:00:00 2001 From: paravis Date: Wed, 1 Jun 2022 00:49:17 +0300 Subject: [PATCH] Include --- GUICtrlOnHover.au3 | 537 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 537 insertions(+) create mode 100644 GUICtrlOnHover.au3 diff --git a/GUICtrlOnHover.au3 b/GUICtrlOnHover.au3 new file mode 100644 index 0000000..f5c1dbe --- /dev/null +++ b/GUICtrlOnHover.au3 @@ -0,0 +1,537 @@ +#Region Header + +#include-once + +#CS UDF Info + + Name.........: GUICtrlOnHover.au3 + Forum link...: http://www.autoitscript.com/forum/index.php?s=&showtopic=55120 + Author.......: G.Sandler a.k.a MrCreatoR (CreatoR's Lab, www.creator-lab.ucoz.ru, www.autoit-script.ru) + Remarks......: + 1) TreeView/ListView Items can not be set :(. + 2) When the window is not active, the hover/leave hover functions will still called, but not when the window is disabled. + 3) The hover/leave hover functions will be called even if the script is paused by such functions as MsgBox(). + 4) The $sHover_Func/$sLeaveHover_Func functions should not introduce significant delays in the main script, + for example by calling functions like Sleep() or MsgBox(). + 5) IMPORTANT! + A) Do not call _GUICtrl_OnHoverRegister inside $sHover_Func/$sLeaveHover_Func functions, it's not a good idea. + + B) This UDF registering WM_COMMAND and WM_LBUTTONDOWN window messages. + Please ensure that those messages are not used after including this library, + if they do, you will have to call __GUICtrl_SOH_WM_COMMAND and __GUICtrl_SOH_WM_LBUTTONDOWN inside those functions. Example: + + Func MY_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam) + __GUICtrl_SOH_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam) + ... + EndFunc + + + *** Version History *** + + [v2.0] - [09.06.2010] + * Fixed potential issue with calling $sPrimaryDownFunc function (first call was performed only after recieving WM_COMMAND message, wich is the control event). + * Fixed an issue with blocking the OnHover function - the OnLeaveHover function was not called untill the OnHover function was blocked. + * Fixed(?) (again) issue when the UDF is not working under 64-bit OS. + * Optimized internal "__GUICtrl_SOH_Call" function to work faster when calling parameters functions. + + [v1.9] - [21.05.2010] + * UDF library now compatible with AutoIt 3.3.6.1. + * UDF library renamed to GUICtrlOnHover.au3. + * Changed the main function name to _GUICtrl_OnHoverRegister, For backwards compatibility reasons, other (old) function names are still supported: + _GUICtrl_SetOnHover, GUICtrl_SetOnHover, GUICtrlSetOnHover, _GUICtrlSetOnHover + + * Fixed(?) issue when the UDF is not working under 64-bit OS. + * Global variables and internal functions renaming (for "cosmetic" reasons only). + * UDF's code is more readable now. + + + [v1.8] - [28.09.2009] + * Few Global variables now have more unique name. + * Fixed an issue with false calling of function on PrimaryDown event. + I.e when the user clicks on other place (not on the hovered control) and drag the cursor to the control, the PrimaryDown function was called. + * Due to (and as a result of) previous issue, the UDF now registering WM_COMMAND and WM_LBUTTONDOWN messages at first UDF call. + + + [v1.7] - [07.07.2009] + + Added _GUICtrl_SetHoverOnBackWindow... + Allows to set the hovering mode: + $iSetBackWin = 1 (default) hovering process will proceed even when GUI is not active (in background). + $iSetBackWin <> 1 hovering process will NOT proceed when GUI is not active. + + + [v1.6] - [12.06.2009] + * Now the UDF compatible with scripts (or other udfs) that uses OnAutoItExit function. + i.e: "OnAutoItExit" function that was *previously* set by user will be called as well. + + + Added new parameter $iKeepCall_Hover_Func. If this parameter = 1, + then the $sHover_Func function *Will* be called constantly untill the control is no longer been hovered + (default is 0, do not call the function constantly). + + Added new arguments to calling function... + The OnPrimaryDown/Up function now can recieve one more argument: + $iClickMode - Defines the Click mode (1 - Pressed, 2 - Released) + + * Changed return value - function will return 2 when $iCtrlID is redefined (ReSet, already exists in the controls list). + * Fixed incorrect documentation parts. + * Fixed "OnClick" handeling. When using multiple GUIs, the active gui was not recognized properly. + * Fixed(?) bug with "dimension range exceeded" when trying to UnSet a Control. + + [v1.5] + + Added AutoIt 3.2.10.0+ support, but 3.2.8.1 or less is dropped :( (due to lack of native CallBack functions). + + Added Primary Down and Primary Up support. Helping to handle with the buttons pressing. + + Added new arguments to calling function... + The OnHover function now can recieve two more arguments: + $iHoverMode - Defines the hover mode (1 - Hover, 2 - Leaves Hovering) + $hWnd_Hovered - Control Handle where the mouse is moved to (after hovering). + + * Almost all code of this UDF was rewritted. + * Now the main function name is _GUICtrl_SetOnHover(), + but for backwards compatibility reasons, other (old) function names are still supported. + * Fixed bug with hovering controls in other apps. + * Improvements in generaly, the UDF working more stable now. + + [v1.?] + * Beta changes, see "Forum link" for more details. + + [v1.0] + * First release. + +#CE + +#EndRegion Header + +#Region Internal Global Variables + +Global $a__GUICtrl_SOH_Ctrls[1][1] +Global $a__GUICtrl_SOH_LastHoveredElements[2] = [-1, -1] +Global $a__GUICtrl_SOH_LastHoveredElementsMark = -1 +Global $h__GUICtrl_SOH_LastClickedElementMark = -1 +Global $i__GUICtrl_SOH_CtrlsModified = 0 +Global $i__GUICtrl_SOH_HoverOnBackWin = 1 +Global $i__GUICtrl_SOH_LastPrimaryDownCtrlID = 0 + +Global $p__GUICtrl_SOH_TimerProc = 0 +Global $i__GUICtrl_SOH_TimerID = 0 + +Global $s__GUICtrl_SOH_User32_Dll = @SystemDir & "\User32.dll" +Global $s__GUICtrl_SOH_OnExitFunc = "" + +If @AutoItVersion < "3.3.2.0" Then + $s__GUICtrl_SOH_OnExitFunc = Execute('Opt("OnExitFunc", "__GUICtrl_SOH_Exit")') +Else + Execute('OnAutoItExitRegister("__GUICtrl_SOH_Exit")') +EndIf + +Global Const $n__GUICtrl_SOH_WM_COMMAND = 0x0111 +Global Const $n__GUICtrl_SOH_WM_LBUTTONDOWN = 0x0201 + +#EndRegion Internal Global Variables + +#Region Public Functions + +; #FUNCTION# ==================================================================================================== +; Name...........: _GUICtrl_OnHoverRegister +; Description....: Registers a function to be called when GUI elements been hovered. +; Syntax.........: _GUICtrl_OnHoverRegister($iCtrlID [, $sHover_Func="" [, $sLeaveHover_Func=-1 [, $sPrimaryDownFunc=-1 [, $sPrimaryUpFunc=-1 [, $iKeepCall_PrDn_Func=1 [, $iKeepCall_Hover_Func=0 ]]]]]]) +; +; Parameters.....: $iCtrlID - The Ctrl ID to set hovering for (can be a -1 as indication to the last item created). +; +; $sHover_Func - [Optional] Function to call when the mouse is hovering the control. +; If this parameter passed as empty string (""), +; then the specified CtrlID is UnSet from Hovering Handler list. +; +; $sLeaveHover_Func - [Optional] Function to call when the mouse is leaving hovering the control +; (-1 no function used). +; * For both parameters, $sHover_FuncName and $sLeaveHover_FuncName, +; the specified function called with maximum 3 parameters: +; $iCtrlID - CtrlID of hovered control. +; $iHoverMode - Defines the hover mode (1 - Hover, 2 - Leaves Hovering). +; $hWnd_Hovered - Control Handle where the mouse is moved to (after hovering). +; +; $sPrimaryDownFunc - [Optional] Function to call when Primary mouse button is *clicked* on the control. +; (-1 -> function is not called). +; +; $sPrimaryUpFunc - [Optional] Function to call when Primary mouse button is *released* the control. +; (-1 -> function is not called). +; +; * For both parameters, $sPrimaryDownFunc and $sPrimaryUpFunc, +; the specified function called with maximum 2 parameters: +; $iCtrlID - CtrlID of clicked control. +; $iClickMode - Defines the click mode (1 - Pressed, 2 - Released). +; +; $iKeepCall_PrDn_Func - [Optional] If this parameter < 1, +; then the $sPrimaryDownFunc function will *Not* be called constantly untill +; the primary mouse button is released (default behaviour - $iKeepCall_PrDn_Func = 1). +; +; $iKeepCall_Hover_Func - [Optional] If this parameter = 1, +; then the $sHover_Func function *Will* be called constantly untill +; the control is no longer been hovered (default behaviour - $iKeepCall_Hover_Func = 0). +; +; Return values..: Success - Returns 1 if the function registered succesefully. +; When $iCtrlID is redefined (ReSet, already exists in the controls list), the return value is 2. +; Failure - Set @error to 1 and return 0 if $iCtrlID is not a GUI Control Identifier. +; +; Author.........: G.Sandler (a.k.a CreatoR), www.creator-lab.ucoz.ru, www.autoit-script.ru. +; Modified.......: +; Remarks........: 1) TreeView/ListView Items can not be set :(. +; 2) When the window is not active, the hover/leave hover functions will still called, but not when the window is disabled. +; 3) The hover/leave hover functions will be called even if the script is paused by such functions as MsgBox(). +; 4) The $sHover_Func/$sLeaveHover_Func functions should not introduce significant delays in the main script, +; for example by calling functions like Sleep() or MsgBox(). +; 5) IMPORTANT! +; A) Do not call _GUICtrl_OnHoverRegister inside $sHover_Func/$sLeaveHover_Func functions, it's not a good idea. +; +; B) This UDF registering WM_COMMAND and WM_LBUTTONDOWN window messages. +; Please ensure that those messages are not used after including this library, +; if they do, you will have to call __GUICtrl_SOH_WM_COMMAND and __GUICtrl_SOH_WM_LBUTTONDOWN inside those functions. Example: +; +; Func MY_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam) +; __GUICtrl_SOH_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam) +; ... +; EndFunc +; +; Related........: +; Link...........: http://www.autoitscript.com/forum/index.php?s=&showtopic=55120 +; Example........: Yes. +; =============================================================================================================== +Func _GUICtrl_OnHoverRegister($iCtrlID, $sHover_Func="", $sLeaveHover_Func=-1, $sPrimaryDownFunc=-1, $sPrimaryUpFunc=-1, $iKeepCall_PrDn_Func=1, $iKeepCall_Hover_Func=0) + Local $hCtrlID = GUICtrlGetHandle($iCtrlID) + + If Not $hCtrlID Then + Return SetError(1, 0, 0) + EndIf + + If $p__GUICtrl_SOH_TimerProc = 0 Then + $p__GUICtrl_SOH_TimerProc = DllCallbackRegister("__GUICtrl_SOH_CALLBACK", "none", "hwnd;int;uint_ptr;dword") + $i__GUICtrl_SOH_TimerID = DllCall($s__GUICtrl_SOH_User32_Dll, "int", "SetTimer", _ + "hwnd", 0, "uint_ptr", Round(TimerInit()), "uint", 30, "ptr", DllCallbackGetPtr($p__GUICtrl_SOH_TimerProc)) + + GUIRegisterMsg($n__GUICtrl_SOH_WM_COMMAND, "__GUICtrl_SOH_WM_COMMAND") + GUIRegisterMsg($n__GUICtrl_SOH_WM_LBUTTONDOWN, "__GUICtrl_SOH_WM_LBUTTONDOWN") + + If IsArray($i__GUICtrl_SOH_TimerID) Then + $i__GUICtrl_SOH_TimerID = $i__GUICtrl_SOH_TimerID[0] + EndIf + EndIf + + ;UnSet Hovering for specified control (remove control id from hovering checking process) + If $sHover_Func = "" And @NumParams <= 2 Then + Local $a__GUICtrl_SOH_Ctrls_Tmp[1][1] + Local $a__GUICtrl_SOH_Ctrls_Swap = $a__GUICtrl_SOH_Ctrls ;This one prevents a bug with "dimension range exceeded" + + For $i = 1 To $a__GUICtrl_SOH_Ctrls_Swap[0][0] + If $hCtrlID <> $a__GUICtrl_SOH_Ctrls_Swap[$i][0] Then + $a__GUICtrl_SOH_Ctrls_Tmp[0][0] += 1 + ReDim $a__GUICtrl_SOH_Ctrls_Tmp[$a__GUICtrl_SOH_Ctrls_Tmp[0][0]+1][7] + + $a__GUICtrl_SOH_Ctrls_Tmp[$a__GUICtrl_SOH_Ctrls_Tmp[0][0]][0] = $a__GUICtrl_SOH_Ctrls_Swap[$i][0] + $a__GUICtrl_SOH_Ctrls_Tmp[$a__GUICtrl_SOH_Ctrls_Tmp[0][0]][1] = $a__GUICtrl_SOH_Ctrls_Swap[$i][1] + $a__GUICtrl_SOH_Ctrls_Tmp[$a__GUICtrl_SOH_Ctrls_Tmp[0][0]][2] = $a__GUICtrl_SOH_Ctrls_Swap[$i][2] + $a__GUICtrl_SOH_Ctrls_Tmp[$a__GUICtrl_SOH_Ctrls_Tmp[0][0]][3] = $a__GUICtrl_SOH_Ctrls_Swap[$i][3] + $a__GUICtrl_SOH_Ctrls_Tmp[$a__GUICtrl_SOH_Ctrls_Tmp[0][0]][4] = $a__GUICtrl_SOH_Ctrls_Swap[$i][4] + $a__GUICtrl_SOH_Ctrls_Tmp[$a__GUICtrl_SOH_Ctrls_Tmp[0][0]][5] = $a__GUICtrl_SOH_Ctrls_Swap[$i][5] + $a__GUICtrl_SOH_Ctrls_Tmp[$a__GUICtrl_SOH_Ctrls_Tmp[0][0]][6] = $a__GUICtrl_SOH_Ctrls_Swap[$i][6] + EndIf + Next + + If $a__GUICtrl_SOH_Ctrls_Tmp[0][0] < 1 Then + __GUICtrl_SOH_ReleaseResources() ;Release the callbacks + Else + $i__GUICtrl_SOH_CtrlsModified = 1 + $a__GUICtrl_SOH_Ctrls = $a__GUICtrl_SOH_Ctrls_Tmp + EndIf + + Return 1 + EndIf + + ;Check if the hovering process already handle the passed CtrlID, if so, just assign new values (functions) + For $i = 1 To $a__GUICtrl_SOH_Ctrls[0][0] + If $hCtrlID = $a__GUICtrl_SOH_Ctrls[$i][0] Then + $a__GUICtrl_SOH_Ctrls[$i][0] = $hCtrlID + $a__GUICtrl_SOH_Ctrls[$i][1] = $sHover_Func + $a__GUICtrl_SOH_Ctrls[$i][2] = $sLeaveHover_Func + $a__GUICtrl_SOH_Ctrls[$i][3] = $sPrimaryDownFunc + $a__GUICtrl_SOH_Ctrls[$i][4] = $sPrimaryUpFunc + $a__GUICtrl_SOH_Ctrls[$i][5] = $iKeepCall_PrDn_Func + $a__GUICtrl_SOH_Ctrls[$i][6] = $iKeepCall_Hover_Func + + Return 2 + EndIf + Next + + $a__GUICtrl_SOH_Ctrls[0][0] += 1 + ReDim $a__GUICtrl_SOH_Ctrls[$a__GUICtrl_SOH_Ctrls[0][0]+1][7] + + $a__GUICtrl_SOH_Ctrls[$a__GUICtrl_SOH_Ctrls[0][0]][0] = $hCtrlID + $a__GUICtrl_SOH_Ctrls[$a__GUICtrl_SOH_Ctrls[0][0]][1] = $sHover_Func + $a__GUICtrl_SOH_Ctrls[$a__GUICtrl_SOH_Ctrls[0][0]][2] = $sLeaveHover_Func + $a__GUICtrl_SOH_Ctrls[$a__GUICtrl_SOH_Ctrls[0][0]][3] = $sPrimaryDownFunc + $a__GUICtrl_SOH_Ctrls[$a__GUICtrl_SOH_Ctrls[0][0]][4] = $sPrimaryUpFunc + $a__GUICtrl_SOH_Ctrls[$a__GUICtrl_SOH_Ctrls[0][0]][5] = $iKeepCall_PrDn_Func + $a__GUICtrl_SOH_Ctrls[$a__GUICtrl_SOH_Ctrls[0][0]][6] = $iKeepCall_Hover_Func + + Return 1 +EndFunc + +;Set the hovering mode: +; $iSetBackWin = 1 (default) hovering process will proceed even when GUI is not active (in background). +; $iSetBackWin <> 1 hovering process will NOT proceed when GUI is not active. +Func _GUICtrl_SetHoverOnBackWindow($iSetBackWin) + $i__GUICtrl_SOH_HoverOnBackWin = Number($iSetBackWin = 1) +EndFunc + +#EndRegion Public Functions + +#Region Backwards Compatibility Functions + +;Backwards compatibility function #1 +Func _GUICtrl_SetOnHover($iCtrlID, $sHover_Func="", $sLeaveHover_Func=-1, $sPrimaryDownFunc=-1, $sPrimaryUpFunc=-1, $iKeepCall_PrDn_Func=1, $iKeepCall_Hover_Func=0) + _GUICtrl_OnHoverRegister($iCtrlID, $sHover_Func, $sLeaveHover_Func, $sPrimaryDownFunc, $sPrimaryUpFunc, $iKeepCall_PrDn_Func, $iKeepCall_Hover_Func) +EndFunc + +;Backwards compatibility function #2 +Func GUICtrl_SetOnHover($iCtrlID, $sHover_Func="", $sLeaveHover_Func=-1, $sPrimaryDownFunc=-1, $sPrimaryUpFunc=-1, $iKeepCall_PrDn_Func=1, $iKeepCall_Hover_Func=0) + _GUICtrl_OnHoverRegister($iCtrlID, $sHover_Func, $sLeaveHover_Func, $sPrimaryDownFunc, $sPrimaryUpFunc, $iKeepCall_PrDn_Func, $iKeepCall_Hover_Func) +EndFunc + +;Backwards compatibility function #3 +Func GUICtrlSetOnHover($iCtrlID, $sHover_Func="", $sLeaveHover_Func=-1, $sPrimaryDownFunc=-1, $sPrimaryUpFunc=-1, $iKeepCall_PrDn_Func=1, $iKeepCall_Hover_Func=0) + _GUICtrl_OnHoverRegister($iCtrlID, $sHover_Func, $sLeaveHover_Func, $sPrimaryDownFunc, $sPrimaryUpFunc, $iKeepCall_PrDn_Func, $iKeepCall_Hover_Func) +EndFunc + +;Backwards compatibility function #4 +Func _GUICtrlSetOnHover($iCtrlID, $sHover_Func="", $sLeaveHover_Func=-1, $sPrimaryDownFunc=-1, $sPrimaryUpFunc=-1, $iKeepCall_PrDn_Func=1, $iKeepCall_Hover_Func=0) + _GUICtrl_OnHoverRegister($iCtrlID, $sHover_Func, $sLeaveHover_Func, $sPrimaryDownFunc, $sPrimaryUpFunc, $iKeepCall_PrDn_Func, $iKeepCall_Hover_Func) +EndFunc + +#EndRegion Backwards Compatibility Functions + +#Region Internal Functions + +;CallBack function to handle the hovering process +Func __GUICtrl_SOH_CALLBACK($hWnd, $uiMsg, $idEvent, $dwTime) + $i__GUICtrl_SOH_CtrlsModified = 0 + + If $a__GUICtrl_SOH_Ctrls[0][0] < 1 Then + Return + EndIf + + If $i__GUICtrl_SOH_HoverOnBackWin Then + Local $iControl_Hovered = __GUICtrl_SOH_ControlGetHovered() + Else + Local $iControl_Hovered = GUIGetCursorInfo() + + If Not IsArray($iControl_Hovered) Then + Return + EndIf + + $iControl_Hovered = GUICtrlGetHandle($iControl_Hovered[4]) + EndIf + + Local $sCheck_LHE = $a__GUICtrl_SOH_LastHoveredElements[1] + Local $iCheck_LCEM = $h__GUICtrl_SOH_LastClickedElementMark + Local $iCtrlID + + ;Leave Hovering Process and reset variables + If Not $iControl_Hovered Or ($sCheck_LHE <> -1 And $iControl_Hovered <> $sCheck_LHE) Then + If $a__GUICtrl_SOH_LastHoveredElementsMark = -1 Then + Return + EndIf + + Local $a__Tmp_GUICtrl_SOH_LastHoveredElements[2] = [$a__GUICtrl_SOH_LastHoveredElements[0], $a__GUICtrl_SOH_LastHoveredElements[1]] + + $a__GUICtrl_SOH_LastHoveredElements[0] = -1 + $a__GUICtrl_SOH_LastHoveredElements[1] = -1 + $a__GUICtrl_SOH_LastHoveredElementsMark = -1 + $h__GUICtrl_SOH_LastClickedElementMark = -1 + + If $a__Tmp_GUICtrl_SOH_LastHoveredElements[0] <> -1 Then + $iCtrlID = DllCall($s__GUICtrl_SOH_User32_Dll, "int", "GetDlgCtrlID", "hwnd", $a__Tmp_GUICtrl_SOH_LastHoveredElements[1]) + + If IsArray($iCtrlID) Then + $iCtrlID = $iCtrlID[0] + EndIf + + ;2 is the indicator of OnLeavHover process + __GUICtrl_SOH_Call($a__Tmp_GUICtrl_SOH_LastHoveredElements[0], $iCtrlID, 2, $iControl_Hovered) + EndIf + Else ;Hovering Process, Primary Down/Up handler, and set $a__GUICtrl_SOH_LastHoveredElements + If $i__GUICtrl_SOH_CtrlsModified = 1 Then + $i__GUICtrl_SOH_CtrlsModified = 0 + Return + EndIf + + Local $iUbound = UBound($a__GUICtrl_SOH_Ctrls)-1 + + For $i = 1 To $a__GUICtrl_SOH_Ctrls[0][0] + If $i > $iUbound Then + ExitLoop + EndIf + + If $a__GUICtrl_SOH_Ctrls[$i][0] = $iControl_Hovered Then + $iCtrlID = DllCall($s__GUICtrl_SOH_User32_Dll, "int", "GetDlgCtrlID", "hwnd", $iControl_Hovered) + + If IsArray($iCtrlID) Then + $iCtrlID = $iCtrlID[0] + EndIf + + ;Primary Down/Up handler + If ($a__GUICtrl_SOH_Ctrls[$i][3] <> "" Or $a__GUICtrl_SOH_Ctrls[$i][4] <> "") And ($iCheck_LCEM = -1 Or $iCheck_LCEM = $iControl_Hovered) Then + Local $aCursorInfo = 0 + Local $hParent_Wnd = DllCall($s__GUICtrl_SOH_User32_Dll, "hwnd", "GetParent", "hwnd", $iControl_Hovered) + + If Not @error And IsArray($hParent_Wnd) Then + $hParent_Wnd = $hParent_Wnd[0] + $aCursorInfo = GUIGetCursorInfo($hParent_Wnd) + Else + $aCursorInfo = GUIGetCursorInfo() + EndIf + + If IsArray($aCursorInfo) Then + ;Primary Down... + ;* First condition is to prevent function call when holding down m.button from other control + ;* Last condition is to Prevent/Allow multiple function call + ;(depending on $iKeepCall_PrDn_Func param). + If ($i__GUICtrl_SOH_LastPrimaryDownCtrlID = $iControl_Hovered Or $i__GUICtrl_SOH_LastPrimaryDownCtrlID = 0) And WinActive($hParent_Wnd) And _ + $aCursorInfo[2] = 1 And $a__GUICtrl_SOH_Ctrls[$i][3] <> -1 And _ + (($a__GUICtrl_SOH_Ctrls[$i][5] < 1 And $iCheck_LCEM <> $iControl_Hovered) Or $a__GUICtrl_SOH_Ctrls[$i][5] > 0) Then + + ;1 is the indicator of Primary*Down* event + __GUICtrl_SOH_Call($a__GUICtrl_SOH_Ctrls[$i][3], $iCtrlID, 1) + + $h__GUICtrl_SOH_LastClickedElementMark = $iControl_Hovered + ;Primary Up + ElseIf $aCursorInfo[2] = 0 And $a__GUICtrl_SOH_Ctrls[$i][4] <> -1 And $iCheck_LCEM = $iControl_Hovered Then + ;2 is the indicator of Primary*Up* event + __GUICtrl_SOH_Call($a__GUICtrl_SOH_Ctrls[$i][4], $iCtrlID, 2) + + $h__GUICtrl_SOH_LastClickedElementMark = -1 + EndIf + EndIf + EndIf + + If $i__GUICtrl_SOH_CtrlsModified = 1 Then + ExitLoop + EndIf + + If $a__GUICtrl_SOH_Ctrls[$i][6] < 1 And $a__GUICtrl_SOH_LastHoveredElementsMark = $a__GUICtrl_SOH_Ctrls[$i][0] Then + ExitLoop + Else + $a__GUICtrl_SOH_LastHoveredElementsMark = $a__GUICtrl_SOH_Ctrls[$i][0] + EndIf + + If $a__GUICtrl_SOH_Ctrls[$i][2] <> -1 Then + $a__GUICtrl_SOH_LastHoveredElements[0] = $a__GUICtrl_SOH_Ctrls[$i][2] + $a__GUICtrl_SOH_LastHoveredElements[1] = $iControl_Hovered + EndIf + + __GUICtrl_SOH_Call($a__GUICtrl_SOH_Ctrls[$i][1], $iCtrlID, 1, 0) ;1 is the indicator of OnHover process + + If $i__GUICtrl_SOH_CtrlsModified = 1 Then + ExitLoop + EndIf + + ExitLoop + EndIf + Next + EndIf + + $i__GUICtrl_SOH_CtrlsModified = 0 +EndFunc + +Func __GUICtrl_SOH_WM_COMMAND($hWndGUI, $MsgID, $WParam, $LParam) + $i__GUICtrl_SOH_LastPrimaryDownCtrlID = $LParam +EndFunc + +Func __GUICtrl_SOH_WM_LBUTTONDOWN($hWndGUI, $MsgID, $WParam, $LParam) + $i__GUICtrl_SOH_LastPrimaryDownCtrlID = 0 +EndFunc + +;Thanks to amel27 for that one!!! +Func __GUICtrl_SOH_ControlGetHovered() + Local $iOld_Opt_MCM = Opt("MouseCoordMode", 1) + Local $tPoint = DllStructCreate("int X;int Y") + Local $aMPos = MouseGetPos() + + DllStructSetData($tPoint, "x", $aMPos[0]) + DllStructSetData($tPoint, "y", $aMPos[1]) + + Local $tPointCast = DllStructCreate("int64", DllStructGetPtr($tPoint)) + Local $aRet = DllCall($s__GUICtrl_SOH_User32_Dll, "hwnd", "WindowFromPoint", "int64", DllStructGetData($tPointCast, 1)) + + Opt("MouseCoordMode", $iOld_Opt_MCM) + + If @error Then + Return SetError(@error, @extended, 0) + EndIf + + Return $aRet[0] +EndFunc + +;Call() function wrapper +Func __GUICtrl_SOH_Call($sFunction, $sParam1="", $sParam2="", $sParam3="", $sParam4="", $sParam5="") + Local $iRet = Call($sFunction) + + If @error <> 0xDEAD Then + Return $iRet + EndIf + + $iRet = Call($sFunction, $sParam1) + + If @error <> 0xDEAD Then + Return $iRet + EndIf + + $iRet = Call($sFunction, $sParam1, $sParam2) + + If @error <> 0xDEAD Then + Return $iRet + EndIf + + $iRet = Call($sFunction, $sParam1, $sParam2, $sParam3) + + If @error <> 0xDEAD Then + Return $iRet + EndIf + + $iRet = Call($sFunction, $sParam1, $sParam2, $sParam3, $sParam4) + + If @error <> 0xDEAD Then + Return $iRet + EndIf + + $iRet = Call($sFunction, $sParam1, $sParam2, $sParam3, $sParam4, $sParam5) + + If @error <> 0xDEAD Then + Return $iRet + EndIf + + Return SetError(1, 0, 0) +EndFunc + +;Release resources function +Func __GUICtrl_SOH_ReleaseResources() + If $p__GUICtrl_SOH_TimerProc > 0 Then + DllCallbackFree($p__GUICtrl_SOH_TimerProc) + EndIf + + If $i__GUICtrl_SOH_TimerID > 0 Then + DllCall($s__GUICtrl_SOH_User32_Dll, "int", "KillTimer", "hwnd", 0, "uint_ptr", $i__GUICtrl_SOH_TimerID) + EndIf + + GUIRegisterMsg($n__GUICtrl_SOH_WM_COMMAND, "") + GUIRegisterMsg($n__GUICtrl_SOH_WM_LBUTTONDOWN, "") + + $p__GUICtrl_SOH_TimerProc = 0 + $i__GUICtrl_SOH_TimerID = 0 +EndFunc + +;Release the CallBack resources when exit +Func __GUICtrl_SOH_Exit() + If $s__GUICtrl_SOH_OnExitFunc <> "" Then + Call($s__GUICtrl_SOH_OnExitFunc) + EndIf + + __GUICtrl_SOH_ReleaseResources() +EndFunc + +#EndRegion Internal Functions