1

我一直在使用 pyhook 和message点击事件的属性,但它似乎只能检测到三个标准按钮。其他人甚至没有到达处理程序。

有没有办法检测鼠标可能有的额外按钮?

4

2 回答 2

2

从WH_MOUSE_LL的文档中:

wParam [in]
Type: WPARAM

鼠标消息的标识符。此参数可以是以下消息之一:WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE、WM_MOUSEWHEEL、WM_MOUSEHWHEEL、WM_RBUTTONDOWN 或 WM_RBUTTONUP。

由于 pyhook 使用 WH_MOUSE_LL 钩子,它似乎仅限于这三个按钮。

按照这个答案,您可以使用 pywin32 并跟踪WM_XBUTTONDOWN消息,据我了解,该消息应该被鼠标按钮 4 和 5 触发。

于 2012-09-14T16:24:22.057 回答
2

WH_MOUSE_LL 确实挂钩 XButtons 并且 PyHook 的 dll 将其传递给 python,但 python 端的 HookManager 忽略它们。但是,您可以跳过 HookManager,直接使用 cpyHook 接口。

此示例在按下鼠标左键时将 xbutton 事件打印到控制台,并在按下鼠标左键时退出:

from pyHook import cpyHook, HookConstants
import pythoncom
import ctypes
user32 = ctypes.windll.user32

XBUTTON1 = 0x0001
XBUTTON2 = 0x0002

wm = { 0x020B: "WM_XBUTTONDOWN", 0x020C: "WM_XBUTTONUP", 0x0201: "WM_LBUTTONDOWN", }

def mouse_handler(msg, x, y, data, flags, time, hwnd, window_name):
    name = wm.get(msg, None)
    if name:
        xb = data >> 16  # high word indicates which xbutton
        print(name, xb & XBUTTON1, xb & XBUTTON2)
        if name == "WM_LBUTTONDOWN":
            user32.PostQuitMessage(0)
    return True  # True = pass the event to other handlers

try:
    cpyHook.cSetHook(HookConstants.WH_MOUSE_LL, mouse_handler)
    pythoncom.PumpMessages() # returns on WM_QUIT
finally:
    cpyHook.cUnhook(HookConstants.WH_MOUSE_LL)
于 2014-09-07T18:43:09.700 回答