找回密码
 加入
搜索
查看: 306|回复: 6

注册的WM_MOUSEMOVE函数有时候鼠标移动没反应

  [复制链接]
发表于 2023-10-17 16:47:27 | 显示全部楼层 |阅读模式


注册的WM_MOUSEMOVE函数有时候鼠标移动没反应,不晓得是什么原因?


Global $k = 0
$Gui = GUICreate("WM_MOUSEMOVE 消息", 500, 250)
GUICtrlCreateLabel('窗口客户区移动鼠标时发送 WM_MOUSEMOVE 消息.', 5, 5, 380, 34)
$Label = GUICtrlCreateLabel('', 10, 45, 230, 110)
GUISetState()

GUIRegisterMsg(0x0200, "WM_MOUSEMOVE")

Do
Until GUIGetMsg() = -3

Func WM_MOUSEMOVE($hWnd, $iMsg, $wParam, $lParam)
    Local $key, $X, $Y
    $X = BitAND($lParam, 0xFFFF) ; _WinAPI_LoWord 低位字
    $Y = BitShift($lParam, 16) ; _WinAPI_HiWord 高位字
    $k += 1
    WinSetTitle($Gui, '', '消息发生次数: ' & $k & ' 坐标 x = ' & $X & ', 坐标 y = ' & $Y)
EndFunc


发表于 2023-10-17 18:52:37 | 显示全部楼层
$Label = GUICtrlCreateLabel('', 10, 45, 230, 110) ;范围很大
在控件上是不会有该消息的。
 楼主| 发表于 2023-10-17 19:33:45 | 显示全部楼层
afan 发表于 2023-10-17 18:52
$Label = GUICtrlCreateLabel('', 10, 45, 230, 110) ;范围很大
在控件上是不会有该消息的。

嗯,谢谢!我本来是想获取鼠标在该控件上悬停时的消息,看来用反了。
发表于 2023-10-17 19:41:27 | 显示全部楼层
smooth 发表于 2023-10-17 19:33
嗯,谢谢!我本来是想获取鼠标在该控件上悬停时的消息,看来用反了。

这种需求可使用 “控件子类化” 捕获悬停等消息。
当然也可简单的使用 GUIGetCursorInfo() 循环获取信息
发表于 2023-10-17 21:16:19 | 显示全部楼层
可以这样写:
Global $k = 0
$Gui = GUICreate("WM_MOUSEMOVE 消息", 500, 250)
GUICtrlCreateLabel('窗口客户区移动鼠标时发送 WM_MOUSEMOVE 消息.', 5, 5, 380, 34)
$Label = GUICtrlCreateLabel('', 10, 45, 230, 110)
GUISetState()

Do
        $Msg = GUIGetMsg(1)
        _MOUSEMOVE($Msg)
Sleep(5)
Until GUIGetMsg() = -3

Func _MOUSEMOVE($iMsg)
        If $iMsg[0] = 0 Then Return
    Local $key, $X, $Y
    $X = $iMsg[3]
    $Y = $iMsg[4]
    $k += 1
    WinSetTitle($Gui, '', '消息发生次数: ' & $k & ' 坐标 x = ' & $X & ', 坐标 y = ' & $Y)
EndFunc
 楼主| 发表于 2023-10-18 12:03:49 | 显示全部楼层

这样不是用windows消息,谢谢!
发表于 2023-10-18 14:14:03 | 显示全部楼层
本帖最后由 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





您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-2 03:23 , Processed in 0.107884 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表