2010-10-26 5 views
12

Я искал эквивалент kbhit(), и я прочитал несколько форумов по этому вопросу, и большинство похоже предлагает использовать ncurses.Создайте функцию для проверки нажатия клавиши в unix с помощью ncurses

Как мне проверить, нажата ли клавиша в C++, используя ncurses.

Функция getch(), предоставляемая ncurses, считывает символ из окна. Я хотел бы написать функцию, которая проверяет только нажатие клавиши, а затем я хочу сделать getch().

Заранее спасибо.

ответ

14

Вы можете использовать функцию nodelay(), чтобы превратить getch() в неблокирующий вызов, который возвращает ERR, если нет нажатия клавиши. Если доступно нажатие клавиши, оно вытягивается из очереди ввода, но вы можете вернуть его обратно в очередь, если хотите, с помощью ungetch().

#include <ncurses.h> 
#include <unistd.h> /* only for sleep() */ 

int kbhit(void) 
{ 
    int ch = getch(); 

    if (ch != ERR) { 
     ungetch(ch); 
     return 1; 
    } else { 
     return 0; 
    } 
} 

int main(void) 
{ 
    initscr(); 

    cbreak(); 
    noecho(); 
    nodelay(stdscr, TRUE); 

    scrollok(stdscr, TRUE); 
    while (1) { 
     if (kbhit()) { 
      printw("Key pressed! It was: %d\n", getch()); 
      refresh(); 
     } else { 
      printw("No key pressed yet...\n"); 
      refresh(); 
      sleep(1); 
     } 
    } 
}