使用pyHook获取鼠标双击事件

1 投票
1 回答
1642 浏览
提问于 2025-04-16 08:15

我正在尝试用pyHook来捕捉鼠标双击事件,但我得到的却是两组单击的记录,比如WM_LBUTTONDOWN(0x201)和WM_LBUTTONUP(0x202)。我其实是想得到WM_LBUTTONDBLCLK(0x203)。我到底漏掉了什么呢?

import pythoncom, pyHook

def OnMouseEvent(event):           
    print event.Message, event.Position
    return True

hm = pyHook.HookManager()
hm.MouseAll = OnMouseEvent
hm.HookMouse()
pythoncom.PumpMessages()

我找到了一些提示:在这篇帖子中,MrZebra提到:“为了能发送这个(0x203),你的窗口类需要用CS_DBLCLKS样式来创建。”

编辑这个页面说明双击会生成这四个消息:WM_LBUTTONDOWN、WM_LBUTTONUP、WM_LBUTTONDBLCLK和WM_LBUTTONUP,但我实际上只得到了前两个消息各两次。

我在Win7x64上使用的是Python 2.7和pyHook 1.5.1。

再次编辑:我会考虑C++/C#的键盘/鼠标钩子作为替代方案。另一方面,我不确定是否常见的做法是通过评估两次点击之间的时间来判断双击事件。

1 个回答

1

你之所以会收到两个 WM_LBUTTONDOWNWM_LBUTTONUP,而没有 WM_LBUTTONDBLCLK,是因为像MrZebra说的那样:目标窗口的类样式没有包含 CS_DBLCLKS 这个样式。除非你能修改这个目标窗口类的源代码,否则它永远不会收到 WM_LBUTTONDBLCLK,因为Windows会把双击分解成两个单独的点击。

解决这个问题的唯一方法是测量点击之间的时间。如果点击的速度足够快,就当作你收到了 WM_LBUTTONDBLCLK。想了解Windows中的双击时间,可以查看这个链接。不要仅仅假设双击的时间是50毫秒,或者其他什么值。

撰写回答