Как определить кнопки мыши с помощью Python

Я использовал Pyhook и тому message Атрибут событий нажатия, но, кажется, в состоянии обнаружить только три стандартные кнопки. Остальные даже не доходят до хендлера.

Есть ли способ обнаружить дополнительные кнопки, которые может иметь мышь?

2 ответа

WH_MOUSE_LL перехватывает XButtons, и dll PyHook передает его через python, но HookManager на стороне python игнорирует их. Однако вы можете пропустить 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)

Из документации для 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.

Другие вопросы по тегам