我正在编写一个命令行应用程序,它在X Windows中监听Control键释放事件,并在检测到它们时警告另一个进程。聆听键盘事件而不捕获它们?
作为GNU/Linux的新手,我宁愿避免摸索GCC,因此我正在寻找一种基于脚本的解决方案。因为我知道一些Python,所以选择一个基于Python的解决方案似乎很自然,并且在清除Internet上的示例并阅读Python Xlib文档后,我将这些程序合并在一起,但有一点需要注意:它会陷入陷阱事件而不是仅仅听他们(我的意思是这些事件不再通过它们被引导到的应用程序)。
我通过运行“xev”跟踪了控制键代码。由于我重新映射了我的修改键,在您的系统上它们可能会有所不同。
为了简单起见,我省略了处理外部进程的代码。
谢谢你的帮助。
软件:
的Python 2.7.2
的Python Xlib的0.15 RC1
的Perl v5.10.1
的Debian GNU/Linux的版本:6.0.3
内核v版为:Linux的Debian的2.6.32-5-686
编辑:我想不通的是,键盘事件不会得到被困,除非它们被处理(在我的计划,这意味着该行“打印“KeyRelease”被执行)。因为在我的代码中,我不会在Xlib或事件对象上调用任何方法,但我不明白处理中的差异在哪里。
EDIT2:除了使用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)
您的评论允许我制定我的问题的答案。谢谢。 – 2012-02-09 21:22:50