wxPython:全局捕获关键事件

wxPython: Catching key events globally

我想用 wxPython 做一些事情,但我不知道怎么做。 (我在 Windows 7 上,我可以接受仅 Windows 的解决方案。)

我想捕捉全球的关键事件。这意味着 key-up、key-down 和 char 事件。 (我正在尝试在 Python 中构建类似 AHK 的东西。)

现在,我知道 wxPython 允许全局热键,但这并不令人满意,因为我想获取所有事件,包括按键向上、按键向下和字符。我怎样才能做到这一点?

我尝试使用 pyHook,除了没有实现 char 事件外,它几乎可以正常工作。 Char 事件似乎很棘手,我想知道如何在全球范围内捕获它们。 (即在所有应用程序中。)我也同意使用 wxPython 以外的其他工具的解决方案。 (除了不是单独的 GUI 框架,我很高兴将 wxPython 用于 GUI,只是用于捕获 char 事件的工具。)

NVDA Windows 的免费开源屏幕 reader 实现了此功能。或许看看他们是如何做到的?

来源:winInputHook.py

PyWin32 具有 SetWindowsHook,它可能会根据此 thread 工作。你也许可以使用 ctypes,虽然我还没有找到任何好的例子。

我也发现了这个看起来很有前途的项目:

抱歉,您无法直接从 Python 可执行文件中捕获 WM_CHAR 事件。您将需要编写一个本机 Windows DLL 来挂钩 WH_GETMESSAGE,然后单独通知您的 Python 进程按下了一个键。

如你所见here the way to catch WM_CHAR is to catch the events read by GetMessage() using the WH_GETMESSAGE hook. Sadly, any global hook for that message must be able to run in the context of any process and so has to be implemented as a DLL (as mandated by the API docs). That means you cannot do this inside your Python process. This is also covered in the Python win32 archives here

这意味着您需要编写一个本机 DLL 来挂接消息,然后使用您最喜欢的 IPC 形式(例如 Post 消息到另一个 window)将任何有趣的事件传递给您的Python 进程。

如果您真的只想 Python 绑定 AutoHotKey,您可以使用 pyahk 为您完成此操作。

这可能不是一个理想的解决方案,但是否尝试过包含一些 pygame 代码?

Pygame 是一个用于构建游戏的模块(顾名思义),但它有一些不错的获取按键的功能。

本教程展示了如何获取键盘输入,它还 pygame 执行一些图形化的操作,但您无需执行任何操作即可获取按键输入。

http://www.nerdparadise.com/tech/python/pygame/basics/part6/

这里是 pygame 使用的关键代码列表。

https://www.pygame.org/docs/ref/key.html