[已解决 - 提供的示例包含答案!] 我试图实现一个程序,该程序在全屏幕中启动,并且不允许任何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