Есть ли способ получить ключевые события на консоли Windows? Мне нужен способ быстро получить keydown и keyup события без GUI. Я попытался использовать getch(), но он не получает keyups и ждет, пока не будет нажата клавиша для возврата.
События консоли консоли С++
Ответ 1
Вы можете использовать GetKeyState
или GetAsyncKeyState
, но это не даст вам событий keydown/keyup. Он расскажет вам, какие клавиши в данный момент недоступны.
Итак, если вам действительно нужно получить события keydown/keyup, вы можете установить крючок. Окно консоли имеет дескриптор окна, который принадлежит коду в Windows и насос сообщений, также принадлежащий коду в Windows.
Вы можете получить дескриптор окна окна консоли, используя GetConsoleWindow Затем установите крюк WH_CALLWNDPROC
, используя SetWindowsHookEx для прослушивания при отправке сообщений в окно консоли.
Вместо этого вы можете попробовать вместо WH_MSGFILTER
. Я не знаю, работает ли это в консольных окнах, но будет генерировать меньше сообщений, чтобы их игнорировать, если они действительно работают.
Ответ 2
Используйте ReadConsoleInput()
API. Следите за событиями рода KEY_EVENT
. Это не будет работать для всех событий keydown (Ctrl-key, shift-key, Pause-key не может быть прочитана), но большинство из них можно прочитать.
Используйте GetNumberOfConsoleInputEvents
, чтобы избежать блокировки.
Ответ 3
Мне было просто любопытно, почему такой логичный вопрос не содержит никаких объяснений в Google, Поэтому нужно спросить об этом здесь. Поэтому я googled для: "консольное приложение для клавиатурных событий" и угадайте, что... первые 2 ссылки интересны (но, к сожалению, не совсем ответы на ваш вопрос):
- Обработка ввода мыши/клавиатуры в MSDN.
- Обработчики событий консоли (например, Ctrl-C и кнопка закрытия окна).
Ответ 4
Существует несколько способов. GetKeyboardState будет одним из самых очевидных.
Ответ 5
Вы также можете попробовать SetConsoleCtrlHandler