我在检测是否只是得到一个普通的ESC键(仅代码27)时遇到问题,或者它是否是另一个特殊键(例如向我发送三个字节的Arrow Up):ESC [A(27 91 65)。

现在,我了解了转义序列,我不了解的是我怎么可能知道用户实际上键入了ESC而不是特殊键,因为两者都以27开头并且ESC仅为27?

请注意,我使用ncurses的wgetch()函数,如下所示:

// initialization not shown initscr() should be enough for this test
while(!f_should_exit)
{
    int c(wgetch(f_win_input));

    // show codes of what the user types
    //
    printf("got [%d] ", c);
    // prints 27 when I hit ESC
    // prints 27 91 65 when I hit Arrow Up
}

我一直在vim中一直使用ESC和箭头键,因此我可以想象有一种简单的方法来专门检测按下了哪个键?

最佳答案

这是X/Open Curses的标准功能。 wgetch的手册页在 keypad mode中进行了讨论:



默认情况下,给定窗口的keypad未设置为true,即库不执行此操作(如果需要功能键,您的程序必须这样做):

keypad(win, TRUE);

超时在ncurses的输入选项手册页中进行了描述。要将转义字符与功能(或光标或键盘键)区分开,可以使用notimeout,如 nodelay 讨论中所述:

关于linux - 我怎么知道用户在带有ncurses的控制台(Linux)中按了ESC键?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48274895/

10-12 20:27