C ++ события клавиатуры консоли - PullRequest
12 голосов
/ 15 января 2010

Есть ли способ получить ключевые события в консоли Windows? Мне нужен способ получать события keydown и keyup быстро без графического интерфейса. Я пытался использовать getch (), но он не получает нажатия клавиш и ждет, пока не будет нажата клавиша для возврата.

Ответы [ 5 ]

8 голосов
/ 15 января 2010

Использование ReadConsoleInput() API. Следите за событиями вида KEY_EVENT. Это не будет работать для всех событий нажатия клавиш (клавиша Ctrl, клавиша Shift, клавиша Пауза не могут быть прочитаны), но большинство из них может быть прочитано.

Используйте GetNumberOfConsoleInputEvents, чтобы избежать блокировки.

7 голосов
/ 15 января 2010

Вы можете использовать GetKeyState или GetAsyncKeyState, но это не даст вам нажатия клавиш / keyup. Он только скажет вам, какие ключи в данный момент не работают.

Так что, если вам действительно нужно получить события keydown / keyup, вы можете установить ловушку. Окно консоли имеет дескриптор окна, которому принадлежит код в Windows, и насос сообщений, также принадлежащий коду в Windows.

Вы можете получить дескриптор окна окна консоли, используя GetConsoleWindow Затем установите хук WH_CALLWNDPROC, используя SetWindowsHookEx для прослушивания сообщений, отправляемых в окно консоли.

Вместо этого вы можете попробовать WH_MSGFILTER hook. Я не знаю, работает ли это для консольных окон, но это будет генерировать меньше сообщений, которые будут игнорироваться, если это работает.

2 голосов
/ 15 января 2010

Мне было просто любопытно, почему такой логичный вопрос не имеет никакого объяснения в Google, Так что нужно спросить это здесь. Так что я погуглил: "приложение консоли событий клавиатуры" и угадайте, что ... первые 2 ссылки интересны (но, к сожалению, не совсем ответы на ваш вопрос):

1 голос
/ 15 января 2010

Есть несколько способов. GetKeyboardState будет одним из самых очевидных.

0 голосов
/ 17 июля 2016

Вы также можете попробовать SetConsoleCtrlHandler

...