1

我有一个问题,这与我之前的许多其他问题相似,但在某种程度上不同,这使得它变得更加困难。:)

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

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

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

4

2 回答 2

1

使用ncurses怎么样,它可以为你做这一切?它还可以帮助您确定如何为您连接的特定终端类型设置文本格式等。

使用 python 绑定提供的getkey()函数,我能够找出不同键的修饰符。我还发现对于 Shift+Arrow 键,有一个单独的键代码,缩写为KEY_SR,KEY_SF用于 up 和 down 和KEY_SLEFTand KEY_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)

你可以玩弄那个。查看getkey() 的源码,我们发现它基本上是getchkeynamecurses 函数的组合。

于 2012-07-22T13:43:48.267 回答
0

我已经成功地完成了我打算做的事情。唯一的问题是它需要我直接连接到键盘驱动程序。现在我不知道没有root权限怎么做,所以我的编辑器需要root。这可能很尴尬。

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

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

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

于 2012-07-22T13:41:15.627 回答