python - wxPython:全局捕获关键事件

标签 python windows wxpython keyboard-hook

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

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

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

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

最佳答案

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

如你所见here捕获 WM_CHAR 的方法是使用 WH_GETMESSAGE Hook 捕获 GetMessage() 读取的事件。遗憾的是,该消息的任何全局 Hook 都必须能够在任何进程的上下文中运行,因此必须作为 DLL 实现(由 API docs 强制执行)。这意味着您不能在 Python 进程中执行此操作。这也包含在 Python win32 文件中 here .

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

如果你真的只是想要 AutoHotKey 的 Python 绑定(bind),你可以使用 pyahk为你做这件事。

关于python - wxPython:全局捕获关键事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31640928/

相关文章:

python - 模式对话框卡住整个应用程序

python - 将 AuiManager 放入 AuiNotebook 页面中

python - 悬停 image_rgba Bokeh

javascript - Js Date 对象到 python datetime

php - 我如何从网络 Web 服务器在网络客户端上创建文件

c++ - std::string.length() 不计算\r\n

windows - 按文件夹层次结构重命名文件

python - wxPython 键绑定(bind)在 Linux 上不起作用

python - 了解聚类中的 np.zeros

python - 在 Pandas 中将行中的最高值设置为 1 并将其余值设置为 0