NCurses和ESC、ALT键

15
我有一个关于NCurses的问题...我需要处理所有的按键,比如Esc、Alt+F等等。问题是这些代码很相似,例如:
Esc - 27
Alt+A - 27 65
例如,Alt+[key]组合键的代码实际上与Esc键类似...你有什么处理方法吗?
4个回答

17

这里是一个Python的例子:

key = self.screen.getch()
if key == ord('q'): # quit
    go = False
elif key == 27: # Esc or Alt
    # Don't wait for another key
    # If it was Alt then curses has already sent the other key
    # otherwise -1 is sent (Escape)
    self.screen.nodelay(True)
    n = self.screen.getch()
    if n == -1:
        # Escape was pressed
        go = False
    # Return to delay
    self.screen.nodelay(False)

经过数天的搜索如何捕获alt键组合,这个终于完成了。我猜测esc和alt具有相同的ASCII代码是一个旧的终端问题。谢谢sjohnson_pi。 - Alan Ennis

10

解决方法:

  1. 使用noecho或timeout模式
  2. 检查27(ALTESC)代码...如果通过:
  3. 尝试读取另一个代码
  4. 如果另一个代码是ERR,则您有ESC键,否则您有ALT+另一个代码

1
如果用户按下 ESC,然后立即又按下另一个键,例如 [,我们的代码是否可以看到两个键都被输入,但它们_并不完全像是ESC_?因为我真的不知道终端怎么知道在我第二次调用以收集下一个字符时,我是在尝试确定是否只是按下了ESC - Alexis Wilke
1
@AlexisWilke 没错。你无法确定他们是否真的快速按下了 Escape,然后按下 [。但是,你通常可以使用如此短的超时时间,以至于没有人可以合理地按下它,而且大多数转义序列都足够长,以至于很难在彼此之间的 25ms 内完美地按下每个键。另一方面,终端可能会比这更快。 - anon

4

如果你不关心支持按下Escape键后再按另一个键的用户(这是从旧终端VT100时代终端遗留下来的),而只想响应PC 101键键盘上的物理键,你可以在你的(C)代码开始处设置以下内容:

ESCDELAY = 10;

man页面更详细地解释了发生了什么:https://man7.org/linux/man-pages/man3/curs_variables.3x.html

然后使用keyname()获取易于strcmp的人类可读名称,以便查看已按下的内容,例如^c表示Control + c。请参见如何使用getch() ncurses获取Ctrl、Shift或Alt?



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接