小德

超级版主
  • 主题:17
  • 回复:42
  • 金钱:142
  • 积分:301
本帖最后由 蒜泥小德 于 2014-10-13 18:43 编辑

之前一直找不python的shell键盘捕捉方案显然input什么的都是要用回车配合的,于是看到了python-xlib。这个方法的好处是可以之间hook到键盘资源,可是也存在一些问题,就是操作其它窗口时需要ungrab键盘资源。
首先安装python-xlib
  1. sudo apt-get install python-xlib
复制代码

这里的例子就是用xlib做一个捕捉上下左右(以及wasd)的程序
  1. #!/usr/bin/env python

  2. from Xlib.display import Display
  3. from Xlib import X



  4. if __name__ == '__main__':
  5.    
  6.     display = Display()

  7.     root = display.screen().root

  8.     root.change_attributes(event_mask = X.KeyPressMask | X.KeyReleaseMask)
  9.    
  10.     ishooked = False
  11.     while True:
  12.         if False == ishooked:
  13.             raw_input('Press ENTER to hook the keyboard, Press ESC to unhook it!')
  14.             root.grab_keyboard(True, X.GrabModeAsync, X.GrabModeAsync, X.CurrentTime)
  15.             ishooked = True
  16.             print 'Please press ESC to unhook the keyboard!'
  17.         else:
  18.             event = display.next_event()
  19.             if 2 == event.type:
  20.                 if 111 == event.detail or 25 == event.detail:
  21.                     print 'Up pressed'
  22.                 elif 116 == event.detail or 39 == event.detail:
  23.                     print 'Down pressed'
  24.                 if 113 == event.detail or 38 == event.detail:
  25.                     print 'Left pressed'
  26.                 elif 114 == event.detail or 40 == event.detail:
  27.                     print 'Right pressed'

  28.             if 3 == event.type:
  29.                 if 111 == event.detail or 25 == event.detail or 116 == event.detail or 39 == event.detail:
  30.                     print 'Up Down Released'
  31.                 if 113 == event.detail or 38 == event.detail or 114 == event.detail or 40 == event.detail:
  32.                     print 'Left Rgiht Released'
  33.                   
  34.             if 9 == event.detail:
  35.                 display.ungrab_keyboard(X.CurrentTime)
  36.                 display.flush()
  37.                 ishooked = False
复制代码