[已解決 - 提供的示例包含答案!] 我試圖實現一個程序,該程序在全屏幕中啓動,並且不允許任何userinput(其他鼠標和鍵盤),因爲它只是作出反應UDEV-信號,當插入USB或CD時。 我想要防止用戶放入鍵盤/鼠標,並在工作站上做些事情。 唯一需要鍵盤的情況是當管理員插入鍵盤並按下CTRL-T時,所以我的程序會打開一個終端窗口。阻止鍵盤,但得到全球Hotkeys XLib
我使用的是Debian(Squeeze)+ Gnome-Desktop-Environment。
我試圖使用XLib,它可以很好地抓取所有的鍵盤事件,但是當我的程序打開我的終端(它也可以完美)時,我不能取下鍵盤,所以用戶不能使用鍵盤,除非鍵盤 - 取消關閉。
這裏有一些重要的代碼片段:
class ScanWSClient(gtk.Window):
def __init__(self, url):
# current display
disp = Display()
self.display = disp
gtk.Window.__init__(self)
self.terminal_window = None
self.kb_handler = KeyboardHandler(self).start()
#self.fullscreen()
self._browser= webkit.WebView()
self.add(self._browser)
self.connect('destroy', gtk.main_quit)
self._browser.open(url)
self.show_all()
class KeyboardHandler(threading.Thread):
def __init__(self, scanws_client):
super(KeyboardHandler,self).__init__()
self.running = True
self.daemon = True
self.terminal_window = None
self.scanws_client = scanws_client #
def run(self):
root = self.scanws_client.display.screen().root
while self.running:
event = root.display.next_event()
self.handle_event(event)
time.sleep(1)
def handle_event(self,aEvent):
keycode = aEvent.detail
state = aEvent.state
key_type = aEvent.type
if keycode == 28 and key_type == X.KeyPress:
if self.scanws_client.terminal_window == None:
self.scanws_client.terminal_window = TerminalWindow(self.scanws_client, "Administrative Shell started...Type *exit* to return to the locked workstation")
else:
self.scanws_client.terminal_window.present()
self.scanws_client.display.flush() #THIS FLUSH IS NECESSARY TO UNGRAB THE KEYBOARD LATER ON!!!
self.scanws_client.display.ungrab_keyboard(1, X.CurrentTime)
print "Key: %s/Mask: %s/Type: %s" % (keycode, state, key_type)
print self.scanws_client.terminal_window
在我的螺紋KeyboardHandler,我獲取所有的xlib排隊的活動,並與我的功能「handle_event」檢查,如果有CTRL-T壓。如果是這樣,我打開我的終端和ungrab我的鍵盤(不工作):
self.scanws_client.display.ungrab_keyboard(1, X.CurrentTime)
誰能告訴我爲什麼我不能ungrab我傻鍵盤? (這個問題提供了cookie;))
完美的作品。但在GrabModeAsync中,它的CTRL-T輸入和我的終端彈出窗口之間有一點延遲......但我認爲這是硬件事件和xlib處理之間的文檔中提到的保留......我更新了我的示例,所以每個人都看到如何解決它..謝謝 – ryyppy 2011-05-23 11:58:21