【问题标题】:wxPython: Catching key events globallywxPython:全局捕获关键事件
【发布时间】:2015-10-16 22:05:41
【问题描述】:

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

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

现在,我知道 wxPython 允许使用全局热键,但这并不令人满意,因为我想获取所有事件,包括 key up、key down 和 char。我怎样才能做到这一点?

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

【问题讨论】:

    标签: python windows wxpython keyboard-hook


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      抱歉,您无法直接从 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 为您执行此操作。

      【讨论】:

      • 如果我创建一个 DLL 然后使用ctypes 从我的 Python 进程中加载​​该 DLL,它会起作用吗?
      • @RamRachum 是的-应该可以。关键是您需要构建独立的本机 DLL 来实现您的钩子。然后,该 DLL 还可以具有其他接口,您可以在 Python 应用程序中使用这些接口。
      • +1 用于引起 AHK 的注意:因为它的 DLL 已经是您需要在其他进程中注入的 DLL。
      【解决方案3】:

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

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

      【讨论】:

      • 谢谢迈克。我探索了这两个链接,但无法从它们那里找到解决问题的方法。
      【解决方案4】:

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

      来源:winInputHook.py

      【讨论】:

      • 看起来他们只监听上键和下键事件,看不到字符事件。
      猜你喜欢
      • 2012-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多