python - 监听键盘事件而不捕获它们?

标签 python perl keyboard-events xlib keyrelease

我正在编写一个命令行应用程序,它在 X Windows 中监听控制键释放事件,并在检测到这些事件时向另一个进程发出警报。

作为 GNU/Linux 的新手,我宁愿避免摸索 GCC,因此我正在寻找基于脚本的解决方案。由于我了解一点 Python,因此选择基于 Python 的解决方案似乎很自然,在网上搜索示例并阅读 Python Xlib 文档后,我将这些有效的程序放在一起,但有一个警告:它陷阱事件而不仅仅是监听它们(我的意思是这些事件不再传递给它们最初被定向到的应用程序)。

我通过运行“xev”找到了控制键代码。由于我重新映射了修改键,因此在您的系统上它们可能有所不同。

为了简单起见,我省略了处理外部进程的代码。

感谢您的帮助。

软件:

  • python 2.7.2

  • Python Xlib 0.15 RC1

  • Perl v5.10.1

  • Debian GNU/Linux 版本:6.0.3

  • 内核版本:Linux debian 2.6.32-5-686

编辑:我想不通的是,除非处理键盘事件,否则它们不会被捕获(在我的程序中,这意味着行 'print "KeyRelease"' 被执行)。由于在我的代码中我没有在 Xlib 或事件对象上调用任何方法,所以我不明白处理的区别在哪里。

EDIT2:也欢迎提出关于使用 Xlib 之外的替代解决方案的建议。

EDIT3:我也知道 Perl,也欢迎提供有关 Perl 库的建议,只要它们不需要最新版本的系统库,因为 Debian 在其存储库中可用的软件包方面出了名的落后, 如果它们有很多依赖项,编译和安装最新版本的库可能会很困难(我尝试安装 PyGTK,但在未能引用我安装的最新 GLib 后放弃)。

    #!/usr/bin/env python

    from Xlib.display import Display
    from Xlib import X

    Control_R  = 64 # Keycode for right Control.
    Control_L  = 108 # Keycode for left Control.
    keycodes = [Control_R, Control_L] # Keycodes we are listening for.

    # Handle X events.
    def handle_event(event):
        # Let us know whether this event is about a Key Release of
        # one of the key we are interest in.
        if event.type == X.KeyRelease:
            keycode = event.detail
            if keycode in keycodes:
                print "KeyRelease"

    # Objects needed to call Xlib.
    display = Display()
    root = display.screen().root

    # Tell the X server we want to catch KeyRelease events.
    root.change_attributes(event_mask = X.KeyReleaseMask)

    # Grab those keys.
    for keycode in keycodes:
        root.grab_key(keycode, X.AnyModifier, 1, X.GrabModeAsync, X.GrabModeAsync)

    # Event loop.
    while 1:
        event = root.display.next_event()
        handle_event(event)

最佳答案

感谢 Croad Langshan 提到的 pykeylogger 库,以及此类库的作者 Tim Alexander 提供的有用示例代码,我已经能够将我的程序更改为:

    #!/usr/bin/env python

    from pyxhook import HookManager

    watched_keys = ["Control_R", "Control_L"]

    def handle_event (event):
        if event.Key in watched_keys:
            print "KeyRelease"


    hm = HookManager()
    hm.HookKeyboard()
    hm.KeyUp = handle_event
    hm.start()

这个程序毫无问题地实现了我的目标。您可以阅读“事件”对象的字段以获取有关事件的更多信息(请参阅“pyxhook.py”的源代码)。

关于python - 监听键盘事件而不捕获它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9203067/

相关文章:

perl - 从 perl 中的外部 *nix 命令获取 STDOUT、STDERR 和响应代码

delphi - 有没有办法在按下 Ctrl +"some key"时停止使用控制字符生成烦人的 OnKeyPress 事件?

javascript - 在我的 Cordova 项目中,我想在 iOS 键盘 'done' 按钮单击上触发一个功能(搜索功能)

java - 使用 Java HID API(管理来自多个键盘的输入)打开 HID 设备时出现 NullPointerException

Python 类成员与实例成员不同

python - dataframe.plot直方图变化标签

perl - 是否有因子图和积调度的 Perl 实现?

python - 在 Docker 容器中安装 python 时执行格式错误

java - Java代码的智能搜索和生成,最好用Python?

bash - 如何使用 find 和 Perl 列出文件?