我在 curses.h 中有一个功能键问题。 我在不同的网站/教程上看到过这个小程序
#include <ncurses.h>
int main()
{ int ch;
initscr(); /* Start curses mode */
raw(); /* Line buffering disabled */
keypad(stdscr, TRUE); /* We get F1, F2 etc.. */
noecho(); /* Don't echo() while we do getch */
printw("Type any character to see it in bold\n");
ch = getch();
while (ch != KEY_F(1))
{
if(ch == KEY_F(1))
printw("F1 Key pressed: Ending program.\n");
else
{ printw("The pressed key is ");
attron(A_BOLD);
printw("%c\n", ch);
attroff(A_BOLD);
}
refresh();
ch = getch();
}
printw("end\n");
endwin(); /* End curses mode */
return 0;
}
F6-F12 键工作正常,返回的代码也正常(例如:如果按下 F6,则为 270)。但是,如果我按 F5,则不会返回 269,就像它应该的那样,而是会发生以下情况(只需按一次 F5):
Type any character to see it in bold
The pressed key is ^[
27
The pressed key is [
91
The pressed key is 1
49
The pressed key is 5
53
The pressed key is ~
126
所以我认为整个转义序列都返回了。我在 Internet 上阅读了有关此问题的信息,两次有提示将 TERM 变量更改为 xterm 或 vt100。所以我尝试将 TERM 更改为 vt 220 和 xterm,但没有任何变化。当我将其更改为 vt100 时,F6-F12 也不起作用。
任何人都可以帮助我如何识别用户是否按了 F1-F5? Enter、Backspace、向上、向下等键都可以正常识别。
最好的问候
最佳答案
听起来 terminfo
所说的终端发送的内容与它实际执行的内容之间存在分歧。可能是由于目标机器上的 terminfo
文件不正确,或者 $TERM
设置错误,或者其他任何原因造成的。
我先比较什么
$ infocmp -L
在目标机器上说,与运行时终端实际发送的内容相比,比如 cat
。
如果您正在运行 xterm,也许您有一个翻译您的功能键的 ~/.Xresources
文件。 VMS 用户通常会以这种方式重新映射 F1 - F5 键。许多终端仿真器(如 Putty)也有重新映射这些键的选项。
关于Ncurses:F1-F5 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12957439/