wxPython:捕捉全球关键事件

有一些我正在试图用wxPython做,我不知道如何。 (我在Windows 7上,而且我只使用Windows的解决scheme。)

我想在全球范围内抓住关键事件。 这意味着键入,键入和字符事件。 (我试图在Python中构build像AHK这样的东西。)

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

我试过使用pyHook,除了char事件没有实现,它几乎工作。 炭事件似乎是棘手的,我想知道如何捕捉全球。 (即在所有应用程序中)。我也可以使用除wxPython之外的其他工具的解决scheme。 (除了不是一个单独的GUI框架,我很高兴使用wxPython的GUI,只是捕获char事件的工具。)

对不起,您不能直接从Python可执行文件捕获WM_CHAR事件。 您将需要编写一个本地Windows DLL来挂钩WH_GETMESSAGE,然后分别通知您的Python进程已经按下了一个键。

正如你在这里看到的,捕获WM_CHAR的方法是使用WH_GETMESSAGE钩子来捕获由GetMessage()读取的事件。 不幸的是,这个消息的任何全局钩子必须能够在任何进程的上下文中运行,因此必须作为DLL来实现(如API文档所要求的那样)。 这意味着你不能在你的Python进程中这样做。 这里也包含了Python win32的档案。

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

如果你真的只想Python的绑定AutoHotKey,你可以使用pyahk为你做这个。

用于Windows的免费和开源的屏幕阅读器NVDA实现了这个功能。 也许看看他们是如何完成的?

来源: winInputHook.py

PyWin32有SetWindowsHook可能根据这个线程工作 。 你可能可以使用ctypes,虽然我还没有找到任何好的例子。

我也发现这个看起来很有希望的项目:

这可能不是一个理想的解决方案,但试图包括一些pygame代码?

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

本教程展示了如何获得键盘输入,它也有pygame做一些grpahical的东西,但你不需要有任何获得按键。

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

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

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