我正在编写一个命令行应用程序,它监听 X Windows 中的 Control 键释放事件,并在检测到这些事件时向另一个进程发出警报。
作为一名 GNU/Linux 新手,我想避免使用 GCC,并寻找基于脚本的解决方案。由于我了解一些 Python,因此选择基于 Python 的解决方案似乎是很自然的选择。经过在 Internet 上搜集示例和阅读 Python Xlib 文档后,我已经编写出了这个程序,它可以工作,但有一个缺点:它会捕获事件而不是仅仅监听它们(我的意思是这些事件不再传递给最初面向的应用程序)。
通过运行 "xev",我已经追踪到了 Control 键代码。由于我重新映射了我的修饰键,在您的系统上它们可能是不同的。
为了保持简单,我省略了处理外部进程的代码。
谢谢您的帮助。
软件:
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 的方法,也没有调用事件对象上的任何方法,所以我不明白处理差异出在哪里。
编辑2:除使用 Xlib 外,关于替代方案的建议也受欢迎。
编辑3:我也知道 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)