阻止键盘但获取全局热键XLib

2024-04-26 11:22:19 发布

您现在位置:Python中文网/ 问答频道 /正文

[已解决-提供的示例包含答案!] 我正在尝试实现一个程序,在全屏启动,不允许任何用户输入(鼠标或键盘),因为它只是对UDEV信号作出反应,当一个usb棒或cd插入。 我想防止用户在工作站上用键盘/鼠标做一些奇怪的事情。 唯一需要键盘的情况是管理员插入一个键盘并按CTRL-T,这样程序就会打开一个终端窗口。在

我使用Debian(挤压)+Gnome桌面环境。在

我尝试使用XLib,它可以很好地捕捉所有的键盘事件,但是当我的程序打开我的终端时,我无法取消我的键盘(这也很好地工作),所以用户不能使用shell,除非关闭键盘获取。在

以下是一些重要的代码片段:

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

在threaded KeyboardHandler中,我获取所有xlib排队事件,并使用我的函数“handle_event”检查是否按下了CTRL-T。如果是这样的话,我打开终端,打开键盘(不工作):

self.scanws_client.display.ungrab_keyboard(1, X.CurrentTime)

谁能告诉我为什么我不能打开我愚蠢的键盘?(此问题由cookie提供;)


Tags: 用户self程序clientevent终端initdef
1条回答
网友
1楼 · 发布于 2024-04-26 11:22:19

你把电话刷新到X服务器了吗?Xlib是异步的,缓冲所有请求,直到您填满缓冲区,发出需要服务器响应的调用,或调用XFlush(C API接口,不确定python绑定名称)。在

相关问题 更多 >