From 53c5191a98a691faa0bcce86b9c26a1e9061fd9c Mon Sep 17 00:00:00 2001 From: paravis Date: Wed, 1 Jun 2022 00:55:05 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B5=D0=BE=D0=B1=D1=85=D0=BE=D0=B4?= =?UTF-8?q?=D0=B8=D0=BC=D0=B0=D1=8F=20=D0=B1=D0=B8=D0=B1=D0=BB=D0=B8=D0=BE?= =?UTF-8?q?=D1=82=D0=B5=D0=BA=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B5=D0=B2=D1=8C=D1=8E=20=D1=82=D0=B5=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GUICtrlOnHover.au3 | 1074 ++++++++--------- 1 file changed, 537 insertions(+), 537 deletions(-) rename GUICtrlOnHover.au3 => include/GUICtrlOnHover.au3 (97%) diff --git a/GUICtrlOnHover.au3 b/include/GUICtrlOnHover.au3 similarity index 97% rename from GUICtrlOnHover.au3 rename to include/GUICtrlOnHover.au3 index f5c1dbe..293518e 100644 --- a/GUICtrlOnHover.au3 +++ b/include/GUICtrlOnHover.au3 @@ -1,537 +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 +#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