题
基本上,我有键检测为我的控制台应用程序,由于某种原因它不检测功能键。
下面是我的代码,我在Linux上使用GNU编译器。任何帮助或想法,将不胜感激。
refresh();
key = getch();
switch(key) {
case KEY_HOME: key = HOME; break;
case KEY_END: key = END; break;
case KEY_UP: key = UP; break;
case KEY_DOWN: key = DOWN; break;
case KEY_LEFT: key = LEFT; break;
case KEY_RIGHT: key = RIGHT; break;
case KEY_NPAGE: key = PGDN; break;
case KEY_PPAGE: key = PGUP; break;
case KEY_DC: key = DEL; break;
case KEY_IC: key = INSERT; break;
case KEY_F(1): key = F(1); break;
case KEY_F(2): key = F(2); break;
case KEY_F(3): key = F(3); break;
case KEY_F(4): key = F(4); break;
case KEY_F(5): key = F(5); break;
case KEY_F(6): key = F(6); break;
case KEY_F(7): key = F(7); break;
case KEY_F(8): key = F(8); break;
case KEY_F(9): key = F(9); break;
case KEY_F(10): key = F(10); break;
case KEY_F(11): key = F(11); break;
case KEY_F(12): key = F(12); break;
case KEY_ENTER: key = ENTER; break;
case KEY_BACKSPACE: key = BACKSPACE; break;
default:
//key = F(2); //For any function keypress, it jumps to default
if (NON_ASCII(key) != 0)
key = UNKNOWN;
}
解决方案
我不是一个诅咒专家,但有点阅读手册页使我获得此程序:
#include <curses.h>
int main()
{
int key;
initscr(); cbreak(); noecho();
while (1)
{
key = getch();
printw ("%u\n", key);
}
return 0;
}
当我按下一个F键,得到了一个3个字符的序列:27,79,(80 + N-1),其中N是F键的数目。我觉得你的交换机必须认识到,关键是一个转义序列,并特别处理它。
修改强>这种模式只对F1-F4成立。 F5改变它。你可能会想从诅咒纳入F(n)的宏。
其他提示
有同样的问题,个人。
铸造F(n)的宏char类型神奇地清除了问题我;
cmd = getch();
switch(cmd){
case 'r':
addch('r');
break;
case 'w':
addch('x');
break;
default:
if(cmd == (char)KEY_F(2)){ endwin(); exit(0); }
}
和类似物。通过F10 F12加上工作了F2。 F公司1,10和11是缺乏对我的xterm一个更好的词“占领”。 (F1打开帮助窗口,F11切换全屏模式等)再次,我不能强调不够,我不能开始猜测为什么该作品。
您可能需要启用使用keypad
功能的终端的“小键盘”功能。从键盘(3×)手册页:
int keypad(WINDOW *win, bool bf);
的键盘选项使得用户的终端的小键盘。如果启用 ( BF 是 TRUE )时,用户可以按下一个功能键(例如箭头键),并 的 wgetch 强>返回表示功能键的单个值,如在 的 KEY_LEFT 即可。如果禁用( BF 是 FALSE ),诅咒不能治疗功能 特别键和程序有权解释的转义序列本身。 如果在终端键盘可以开启(到发射制造)和关断 (工作由局部地),启用此选项将导致终端键盘是 当导通的 wgetch 强>被称为上。用于键盘的默认值是假的。
不隶属于 StackOverflow