C++控制台键盘事件

12

有没有办法在Windows控制台中获取按键事件?我需要一种能够快速获取按下和释放按键事件的方法,而不需要使用GUI。我已经尝试过使用getch()函数,但它无法获取释放按键事件,并且会等待直到按键被按下才返回。


你说“没有图形用户界面”,但在Windows上,大多数时候(据我所知),你正在使用窗口内的控制台。在有窗口的情况下,你可以挂钩该窗口并捕获其消息。 - Zac
5个回答

11

使用ReadConsoleInput() API。注意事件类型为KEY_EVENT的事件。这不适用于所有按键事件(如Ctrl键、Shift键、暂停键等无法读取),但大多数按键可以读取。

使用GetNumberOfConsoleInputEvents来避免阻塞。


7
您可以使用GetKeyStateGetAsyncKeyState,但这不会触发键按下/键弹起事件。它只会告诉您当前按下了哪些键。
因此,如果您确实需要获取键按下/键弹起事件,可以安装钩子。
控制台窗口具有由Windows中的代码拥有的窗口句柄和消息泵,也由Windows中的代码拥有。
您可以使用GetConsoleWindow来获取控制台窗口的窗口句柄,然后使用SetWindowsHookEx安装一个WH_CALLWNDPROC钩子以侦听发送到控制台窗口的消息。
您可以尝试使用WH_MSGFILTER钩子。我不知道这是否适用于控制台窗口,但如果适用,则会生成较少的要忽略的消息。

2
我只是好奇,为什么Google上没有任何关于这样一个逻辑问题的解释,所以人们不得不在这里提出问题。因此,我搜索了:"keyboard events console application",猜猜看……前两个链接很有趣(但不幸的是,不完全是你问题的答案):

3
我Google了同样的东西,猜猜……第三个链接指向了这个页面。 - avakar

1

有很多种方法。GetKeyboardState 是其中最明显的之一。


-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接