wxPython:捕捉全球关键事件
我正在尝试使用wxPython,但我无法弄清楚。 (我在Windows 7上,而且我可以使用仅限Windows的解决方案。)
我想在全球范围内抓住关键事件。 这意味着键入,键入和字符事件。 (我试图在Python中构建类似AHK的东西。)
现在,我知道wxPython允许使用全局热键,但这并不令人满意,因为我想要获取所有事件,包括密钥,密钥和字符。 我怎样才能做到这一点?
我尝试使用pyHook,它几乎工作,除了char事件没有实现。 Char事件似乎很棘手,我想知道如何在全球范围内捕获它们。 (即在所有应用程序中)。我也可以使用除wxPython之外的其他工具的解决方案。 (除了没有单独的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进程。
如果你真的只想为AutoHotKey绑定Python,你可以使用pyahk为你做这件事。
用于Windows的免费和开源屏幕阅读器NVDA实现了此功能。 也许看看他们如何完成它?
来源:winInputHook.py
PyWin32有SetWindowsHook ,它可以根据这个线程工作。 你可能能够使用ctypes,尽管我还没有找到任何好的例子。
我还发现这个看起来很有希望的项目: