GNU编译器KEY_F没有检测到功能键

时间:2010-08-12 14:38:39

标签: c curses

基本上,我对我的控制台应用程序进行了密钥检测,由于某种原因它没有检测到功能键。

这是我的代码,我在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;
        }    

3 个答案:

答案 0 :(得分:2)

我不是一个诅咒专家,但是一些阅读手册让我得到了这个程序:

#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改变了它。你可能想要从curses中加入F(n)宏。

答案 1 :(得分:1)

您可能需要使用keypad功能启用终端的“键盘”功能。从键盘(3x)手册页:

  

int keypad(WINDOW *win, bool bf);

     

键盘选项启用用户终端的键盘。如果启用   ( bf TRUE ),用户可以按功能键(例如箭头键)和    wgetch 返回表示功能键的单个值,如   的 KEY_LEFT 即可。如果禁用( bf FALSE ), curses 不会处理功能   特别是键,程序必须解释转义序列本身。   如果终端中的键盘可以打开(发送)和关闭   (在本地工作),打开此选项会导致终端键盘   调用 wgetch 时打开。键盘的默认值为false。

答案 2 :(得分:0)

个人也有同样的问题。

将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); }
    }

之类的。适用于F2至F10加F12。由于我的xterm缺少一个更好的单词,F的1,10和11被“占用”。 (F1打开帮助窗口,F11切换全屏模式等)同样,我无法强调我无法开始猜测为什么会有效。