捕获linux控制台中的关键事件

时间:2012-07-20 06:59:25

标签: linux console keyboard-events

我有一个问题,就像我之前的很多其他问题一样,但是在某种程度上它会变得更加困难。 :)

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

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

是否有人拥有能够检测任何组合键的示例代码(或者至少包含shift,ctrl和alt的所有组合)。

2 个答案:

答案 0 :(得分:0)

我有点像我设定的那样去做。唯一的问题是它需要我直接连接到键盘驱动程序。现在我不知道没有root权限怎么做,所以我的编辑需要root。这可能很尴尬。

简而言之,我打开/ dev / input / event?流,哪里?是键盘驱动程序的编号(通常为0)并从那里捕获按键。这实际上仅用于检查密钥的状态(通过从向下和向上事件构建密钥状态),因为事件是从所有应用程序传递的(这是在所有键盘驱动程序之后)。

最好从更传统的来源获取所有其他按键,只需使用键盘驱动程序进行CTRL,SHIFT等操作。

如果我让它一起工作,我会稍后发布代码。 :)

答案 1 :(得分:0)

如何使用ncurses来完成所有这些操作?它还可以帮助您找出如何为您连接的特定终端类型设置文本格式等等。

使用python绑定提供的getkey()函数,我能够找到不同键的修饰符。我还发现,对于Shift +箭头键,有一个单独的键代码,缩写为KEY_SRKEY_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函数的组合。