基本上,我有键检测为我的控制台应用程序,由于某种原因它不检测功能键。

下面是我的代码,我在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 被称为上。用于键盘的默认值是假的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top