【问题标题】:Capturing key events in the linux console在 linux 控制台中捕获关键事件
【发布时间】:2012-07-20 06:59:25
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: linux console keyboard-events


    【解决方案1】:

    使用 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(),我们发现它基本上是getchkeynamecurses函数的组合。

    【讨论】:

    • 我正在使用 ncurses。出于某种原因,它无法检测到“Shift+Up”和“Shift+Down”,我预测某些键的 Ctrl 和 Alt 也会出现问题。这意味着我必须以其他方式检测这些按键。
    • @TheScienceBoy 我在回复中添加了一个示例和一些参考。我现在看到您的问题在哪里检测到 shift+up 和 shift+down。希望这会有所帮助!
    • 我在我的系统上尝试了您的解决方案,但在 X11 中(为方便起见,我首先尝试了该解决方案)未检测到 shift+key up 和 shift+key down(sleft 和 sright 有效)。在 X11 外部的适当控制台中检测到无 shift 键。据我了解,这种事情需要在 Linux 中使用非常低级的解决方案,这有点令人难过。人们会认为键盘处理会更容易。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 2020-08-31
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      相关资源
      最近更新 更多