【发布时间】:2013-02-26 21:40:15
【问题描述】:
我正在为 Linux 上的控制台程序编写命令行界面。我希望能够在其中使用箭头之类的键。所以为了捕获代码,我使用了这个简单的程序:
int main()
{
int c = 0;
while (c != 3) { // ctrl-c
c = getchar();
printf("%d\n", c);
}
}
这样做我在捕获 HOME 键时遇到了问题。在一台计算机上,我得到序列“27 91 72”,在另一台计算机上得到“27 79 72”,在第三台计算机上得到“27 91 49 126”。
我不知道为什么我在 HOME 和 END 键上得到如此不同的代码(箭头和 F1-F12 键在三台计算机上给出了相同的序列)。
有没有一种标准的方式来获取这个密钥,或者某种配置可以在所有机器上给我相同的序列?
【问题讨论】:
-
“特殊”键发送的转义码因终端类型而异,更糟糕的是,它们不一定形成前缀码。您应该使用curses 为您管理所有这些。
-
顺便说一下,通常
c永远不会等于3,因为如果用户按下Ctrl-C,那么您将得到SIGINT信号。 -
这是一个比你想象的更复杂的问题......生成的代码取决于终端类型(文本控制台、xterm、gnome 或 kde 终端或 windows 命令行都不同在这方面)以及控制台驱动程序或 X 键盘映射设置。 Linux 文本终端 HOWTO,tldp.org/HOWTO/Text-Terminal-HOWTO.html 给出了一些起点,特别是参见第 6 节(一定要使用并遵循那里提供的链接)。如果您想以 可移植 的方式执行此操作(没有大量依赖于术语类型的代码),请使用像
ncurses这样的库。 -
你可能想使用terminfo,如果不是诅咒的话
标签: linux terminal keyboard getchar