本帖最后由 tubaba 于 2023-10-18 14:23 编辑
注册一个窗口处理程序来处理发生的指定消息
#include <WinAPISysWin.au3>
#include <WinAPIInternals.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 357, 167)
$Label1 = GUICtrlCreateLabel("MOUSEHOVER TEST", 112, 72, 112, 17)
Global $hLabel_CallBack = DllCallbackRegister("_Label_CallBackFunc", "int", "hWnd;uint;wparam;lparam")
Global $hOForm_Label_CallBack = _WinAPI_SetWindowLong(GUICtrlGetHandle($Label1), 0xFFFFFFFC, DllCallbackGetPtr($hLabel_CallBack))
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func _Label_CallBackFunc($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg, $iwParam, $ilParam
Local $iCtrl = _WinAPI_GetDlgCtrlID($hWnd)
Local Const $TME_HOVER = 0x00000001
Local Const $TME_LEAVE = 0x00000002
Switch $iCtrl
case $Label1
Switch $iMsg
Case $WM_MOUSEHOVER ;鼠标悬停
Case $WM_MOUSELEAVE ;鼠标离开
Case $WM_MOUSEMOVE ;鼠标移动
__TrackMouseEvent($hWnd, BitOR($TME_HOVER, $TME_LEAVE), 1) ;//MOUSELEAVE|MOUSEHOVER消息由此函数触发
Local Static $n
$n +=1
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $n = ' & $n & @CRLF & '>Error code: ' & @error & ' Extended code: ' & @extended & ' (0x' & Hex(@extended) & ') SystemTime: ' & @hour & ':' & @min & ':' & @sec & @CRLF) ;### Debug Console
Case $WM_SETCURSOR ;设置光标
GUICtrlSetCursor($iCtrl, 0)
Case $WM_LBUTTONDOWN
EndSwitch
Return _WinAPI_CallWindowProc($hOForm_Label_CallBack, $hWnd, $iMsg, $iwParam, $ilParam)
EndSwitch
EndFunc ;==>_Label_CallBackFunc
Func __TrackMouseEvent($hWnd, $iFlags, $iTime = -1)
Local $tTME = DllStructCreate('dword;dword;hwnd;dword')
DllStructSetData($tTME, 1, DllStructGetSize($tTME))
DllStructSetData($tTME, 2, $iFlags)
DllStructSetData($tTME, 3, $hWnd)
DllStructSetData($tTME, 4, $iTime)
Local $aRet = DllCall('user32.dll', 'bool', 'TrackMouseEvent', 'struct*', $tTME)
If @error Then Return SetError(@error, @extended, 0)
Return $aRet[0]
EndFunc ;==>__TrackMouseEvent
|