如何在 Python 中获取鼠标 up/down/moved 和按键事件

How to get mouse up/down/moved and key press events in Python

我已经在为 Linux 编写的 Python 2.7 项目上工作了一段时间,以向其添加 Windows 支持。我想弄清楚如何获取键盘按下和鼠标移动、按下或释放的事件。我安装了 win32api 和 pyHook,但我不知道如何正确安装。请注意,我希望它无论在何处都能获得事件,而不仅仅是在命令提示符下按下时。以下是 linux:

中的操作方法
def handle_event(self):
    """ This function is called when a xlib event is fired """

    data = reply.data

    while len(data):
        event, data = rq.EventField(None).parse_binary_value(data, self._display.display, None, None)

        if event.type == X.MotionNotify:
            if self._mouse_last_x != None:
                mouse_distance=math.sqrt((event.root_x-self._mouse_last_x)**2+(event.root_y-self._mouse_last_y)**2)
                self.send_event(('mouse_moved',mouse_distance))
            self._mouse_last_x,self._mouse_last_y = event.root_x,event.root_y

        if event.type == X.ButtonPress:
            print event.sequence_number,event._data,event._fields
            self.send_event(('button_down',event._data['detail']))

        elif event.type == X.ButtonRelease:
            print event.sequence_number,event._data,event._fields
            self.send_event(('button_up',event._data['detail']))

        elif event.type == X.KeyPress and event.sequence_number == 0:
            key = event.detail
            self.send_event(('keys_pressed',key,1))

def run(self):
    self.disable_keyboard_interrupt()
    root = self._display.screen().root
    ctx = self._display.record_create_context(
                0,
                [record.AllClients],
                [{
                        'core_requests': (0, 0),
                        'core_replies': (0, 0),
                        'ext_requests': (0, 0, 0, 0),
                        'ext_replies': (0, 0, 0, 0),
                        'delivered_events': (0, 0),
                        'device_events': (X.KeyReleaseMask, X.PointerMotionMask),
                        'errors': (0, 0),
                        'client_started': False,
                        'client_died': False,
                }])

    self._display.record_enable_context(ctx, self.handle_event)

我似乎无法弄清楚如何使用任何库为 Windows 获取它。

有 Win32 API 函数 SetWindowsHookEx.

Python 上的示例:Applying low-level keyboard hooks with Python and SetWindowsHookExA

pyHook 也是适用于 32 位 Python 的良好软件包(它有点过时,您需要一些努力才能使用 MinGW 为 x64 重新构建它)。示例:Detecting Mouse clicks in windows using python

为了检测鼠标左键和右键的按下或释放,请在此处检查我仅使用 win32api 的解决方案: Python mouse click detection just with win32api