我正在編寫一個命令行應用程序,它在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