2012-07-20 88 views
1

我遇到了一个问题,这与我之前的很多其他问题类似,但以不同的方式使问题变得更加困难。 :)在linux控制台捕获关键事件

我正在为Linux控制台编写一个文本编辑器。没有X11运行,所以忘记任何工具包。我想要捕获按键和按键事件,因为我希望能够通过按住Shift键并使用箭头键(很像在基于X或Windows的编辑器中)来标记文本的各个部分。

我以前设法编写了一个使用原始模式访问键扫描码的应用程序,但它无法同时处理检测移位键和箭头键。

有没有人有一个示例代码,能够检测到任何组合键(或至少所有与shift,ctrl和alt组合)。

回答

0

我有点想办法做我想做的事情。唯一的问题是它需要我直接连接到键盘驱动程序。现在我不知道如何做到这一点,没有root权限,所以我的编辑器需要root权限。这可能很尴尬。

总之,我打开/ dev/input/event?流,在哪里?是键盘驱动程序的编号(通常为0)并从那里捕获按键。由于事件是从所有应用程序传递的(这完全是键盘驱动程序),因此这对于检查某个键的状态(通过构建向下和向上按下事件中的键状态)来说是非常有用的。

最好从一个更传统的来源获取所有其他按键,并使用CTRL,SHIFT等键盘驱动程序。

我以后会发布代码,如果我得到它一起工作。 :)

0

如何使用ncurses,它为你做了什么?它还可以帮助您了解如何为您连接的特定终端类型设置文本格式等。

使用python绑定提供的getkey()函数,我可以找出不同键的修饰符。我还发现,对于Shift +方向键,有一个单独的密钥代码,缩写为KEY_SR,KEY_SF,上下和KEY_SLEFTKEY_SRIGHT

import curses 
import curses.textpad 
import curses.ascii 

def decodeSuffix(i): 
    return { 
     0b110: (True, True, False), 
     0b100: (True, False, True), 
     0b111: (False, True, True), 
     0b101: (False, True, False), 
     0b011: (False, False, True), 
    }[i] 

def test(stdscr): 
    while True: 
     k = stdscr.getkey() 
     if k == "\n": 
      return 
     elif k[0] == "k" and len(k) > 1: 
      i = int(k[-1]) 
      shift, ctrl, alt = decodeSuffix(i) 
      s = "" 
      if shift: 
       s += "shift " 
      if ctrl: 
       s += "ctrl " 
      if alt: 
       s += "alt " 
      s += k[1:-1] 
      stdscr.addstr("{0:40s} {1:08b}\n".format(s, i)) 
     else: 
      stdscr.addstr("{0}\n".format(k)) 
      pass 

curses.wrapper(test) 

你可以玩这个。看看source of getkey(),我们发现它基本上是getchkeyname curses函数的组合。

+0

我正在使用ncurses。出于某种原因,它无法检测到“Shift + Up”和“Shift + Down”,并且我预测它对于某些键的Ctrl和Alt也会有问题。这意味着我必须以其他方式检测这些按键。 – 2012-07-23 06:17:18

+0

@TheScienceBoy我添加了一个例子和一些对我的回复的引用。我现在看到你的问题在哪里检测到shift + up和shift + down。希望这可以帮助! – 2012-07-24 08:28:54

+0

我在我的系统上尝试了你的解决方案,但是在X11中(为了方便起见,我首先尝试了)没有检测到shift + key和shift + key down(sleft and sright working)。在X11外部的适当控制台中检测到不换档键。 据我了解,这种事情需要Linux中真正的低级别解决方案,这有点令人伤心。人们会认为键盘处理会更容易。 – 2012-10-22 18:20:50