ncurses的getch()不起作用

时间:2011-12-17 16:44:00

标签: linux key ncurses getch

我需要为我的程序创建一个mainloop并编写以下函数:

void menu(){
int ch;
cbreak();
noecho();
initscr();
refresh();
while (ch != KEY_F(9)){
    ch = getch();
    cout << ch << endl;
    switch (ch){
        case KEY_F(1): add();
            break;

        case KEY_F(2): edit();
            break;

        case KEY_F(3):
            break;

        case KEY_F(4):
            break;


    }

}

endwin();

}

但getch()不起作用并在循环中打印-1。我怎样做? 我可以设置特殊的attr或调用特殊功能吗?

3 个答案:

答案 0 :(得分:1)

您需要致电keypad(),例如keypad(stdscr, TRUE)。但除此之外,功能键可能无法在终端上运行。检查你的ncurses.h文件中是否有has_key()函数,你可以用它来确定它们是否在你的终端上可用。

答案 1 :(得分:0)

首先,只有在调用initscr()后才能使用每个ncurses函数。您的代码cbreak()noecho()可能会被忽略 其次,如果你想使用function keys,你必须通过调用keypad(stdscr, TRUE)告诉ncurses。但是,由于并非每台计算机都有功能键,因此您应始终使用has_key()检查系统是否支持该功能(对于检查当前终端是否支持颜色的has_colors()是否相同)。

答案 2 :(得分:0)

是的,我的循环在这里:

initscr();
clear();
noecho();
cbreak();   /* Line buffering disabled. pass on everything */
startx = (80 - WIDTH) / 2;
starty = (24 - HEIGHT) / 2;


menu_win = newwin(HEIGHT, WIDTH, starty, startx);
keypad(menu_win, TRUE);
mvprintw(0, 0, "Name of my program");
refresh();
print_menu(menu_win, highlight);
while (true)

    {   c = wgetch(menu_win);
        switch(c){
TYPE OF KEYS;
}//END OF SWITCH
}//END OF LOOP