在不捕获键盘事件的情况下聆听键盘事件?

Raf*_*rdi 14 python perl xlib keyboard-events keyrelease

我正在编写一个命令行应用程序,它在X Windows中侦听Control key release事件,并在检测到它时向另一个进程发出警报.

作为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

编辑:我无法弄清楚的是键盘事件不会被捕获,除非它们被处理(在我的程序中,这意味着行'打印'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)
Run Code Online (Sandbox Code Playgroud)

Raf*_*rdi 12

感谢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()
Run Code Online (Sandbox Code Playgroud)

该计划完成了我的目标,没有任何问题.您可以阅读"event"对象的字段以获取有关该事件的更多信息(请参阅"pyxhook.py"的源代码).


Cro*_*han 1

想必这个项目必须有解决该问题的代码:

http://sourceforge.net/apps/mediawiki/pykeylogger/index.php?title=Main_Page