我正在编写一个命令行应用程序,它侦听 X Windows 中的 Control 键释放事件,并在检测到这些事件时向另一个进程发出警报。
作为 GNU/Linux 的新手,我宁愿避免摸索 GCC,因此我正在寻找基于脚本的解决方案。由于我对 Python 有所了解,因此选择基于 Python 的解决方案似乎很自然,在互联网上查找示例并阅读 Python Xlib 文档之后,我将这个可以运行的程序组合在一起,但有一个警告:它会陷入困境事件而不是仅仅监听它们(我的意思是此类事件不再传递到它们最初定向到的应用程序)。
我通过运行“xev”追踪了控制键代码。由于我已经重新映射了修改键,因此在您的系统上它们可能会有所不同。
为了简单起见,我省略了处理外部进程的代码。
感谢您的帮助。
软件:
编辑:我不明白的是,键盘事件不会被捕获,除非它们被处理(在我的程序中,这意味着“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)