【问题标题】:How to detect mouse side buttons with Python如何使用 Python 检测鼠标侧键
【发布时间】:2012-09-14 16:18:54
【问题描述】:

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

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

【问题讨论】:

    标签: python pyhook


    【解决方案1】:

    来自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 钩子,它似乎仅限于这三个按钮。

    this answer 之后,您可以使用 pywin32 并跟踪 WM_XBUTTONDOWN 消息,据我了解,该消息应该会因鼠标按钮 4 和 5 而被触发。

    【讨论】:

      【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-28
        • 2015-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-02
        相关资源
        最近更新 更多