wxPython:全局捕获关键事件

时间:2015-07-26 19:15:44

标签: python windows wxpython keyboard-hook

我尝试用wxPython做的事情,我无法弄清楚如何做。 (我在Windows 7上工作,我只使用Windows解决方案。)

我想全局捕捉关键事件。这意味着关键,关键和char事件。 (我试图在Python中构建像AHK这样的东西。)

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

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

4 个答案:

答案 0 :(得分:4)

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

正如您所看到的那样here捕获WM_CHAR的方法是使用WH_GETMESSAGE钩子捕获GetMessage()读取的事件。遗憾的是,该消息的任何全局钩子必须能够在任何进程的上下文中运行,因此必须作为DLL实现(由API docs强制执行)。这意味着您无法在Python进程中执行此操作。 Python win32档案here中也包含了这一点。

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

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

答案 1 :(得分:0)

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

来源:winInputHook.py

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

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

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

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

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