2011-05-17 18 views
3

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

回答

1

你是否调用了X服务器? Xlib是异步的并缓存所有请求,直到你填充缓冲区,进行需要服务器响应的调用,或者调用XFlush(C API接口,不确定python绑定名称)。

+0

完美的作品。但在GrabModeAsync中,它的CTRL-T输入和我的终端弹出窗口之间有一点延迟......但我认为这是硬件事件和xlib处理之间的文档中提到的保留......我更新了我的示例,所以每个人都看到如何解决它..谢谢 – ryyppy 2011-05-23 11:58:21