paravis
3 years ago
1 changed files with 537 additions and 0 deletions
@ -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 |
Loading…
Reference in new issue