Входной цикл обработки событий в консольном приложении - PullRequest
2 голосов
/ 13 марта 2010

Я пытаюсь создать небольшое консольное приложение, способное обрабатывать нажатия клавиш как события. Что мне нужно, так это в основном возможность получать нажатия клавиш и иметь возможность что-то с ними делать, не имея дело с типичными функциями чтения стандартного ввода.

Я пытался проверить код программ, таких как mplayer, которые реализуют это (например, для остановки воспроизведения), но я не могу понять суть этого с такой большой базой кода.

Спасибо

Ответы [ 4 ]

4 голосов
/ 13 марта 2010

Вы можете использовать семейство функций ncurses ' getch ', как показано в ссылке, вот еще одна ссылка , которая будет вам полезна, кстати, она должна быть отметил, что ncurses является переносимым на платформу, так что вы должны быть в порядке с ним, если вы решите переназначить на другую платформу, которая является большим плюсом ...

2 голосов
/ 13 марта 2010

Чтобы переключить стандартный ввод в буфер не до тех пор, пока не нажмете ввод, вы можете возиться с настройками ввода-вывода терминала, например ..

struct termios oldopts;
struct termios newopts;

tcgetattr(fileno(stdin), &oldopts);
newopts = oldopts;
newopts.c_lflag &= (~ICANON & ~ECHO);
tcsetattr(fileno(stdin), TCSANOW, &newopts);

Структура termios и прототипы tcgetattr () и tcsetattr () находятся в файле termios.h.
Затем вы можете использовать select (), чтобы проверить, готов ли символ для чтения.

2 голосов
/ 13 марта 2010

Проверьте, есть ли у вас доступ к функции getch (). С помощью этой функции вы можете получить одно нажатие клавиши, даже (CTRL + (char)). После того, как у вас есть эти данные, я полагаю, что вам нужно просто создать обработчик для этого события. Итак, вы могли бы реализовать таблицу пар ptr индекса / функции, используя нажатие клавиши в качестве индекса и назначая каждому индексу указатель функции для обработки этого события. Надеюсь, это поможет.

2 голосов
/ 13 марта 2010

В основе указанных приложений вы найдете select(2). Просто используйте его против стандартного ввода, чтобы узнать, когда вы можете прочитать ввод с него.

...