getch() ncurses не работает

Мне нужно создать основной цикл для моей программы и написать следующую функцию:

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 в цикле. как я сделаю? Могу ли я установить специальный атрибут или вызвать специальную функцию?


person PersianGulf    schedule 17.12.2011    source источник


Ответы (3)


Вам нужно позвонить keypad(), например. keypad(stdscr, TRUE). Но помимо этого функциональные клавиши могут не работать на вашем терминале. Проверьте файл ncurses.h на наличие функции has_key(), и вы можете использовать ее для определения если они доступны на вашем терминале.

person Duck    schedule 17.12.2011
comment
Вызовы cbreak() и noecho() также должны быть после вызова initscr(). - person Craig; 20.12.2011
comment
Я решил это, после initscr() я должен вызвать cbreak, а затем keypad(), а затем getch() работать правильно. спасибо. - person PersianGulf; 28.12.2011

Во-первых, каждую функцию ncurses следует использовать только после вызова initscr(). В вашем коде cbreak() и noecho(), вероятно, игнорируются.
Во-вторых, если вы хотите использовать функциональные клавиши, вы должны сообщить об этом ncurses, вызвав keypad(stdscr, TRUE). Однако, поскольку не на каждом компьютере есть функциональные клавиши, вы всегда должны проверять, поддерживает ли система эту функцию, используя has_key() (то же самое для has_colors(), который проверяет, поддерживает ли текущий терминал цвета).

person Lubulos    schedule 28.12.2011

Да, моя петля здесь:

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
person PersianGulf    schedule 29.12.2011