从 MSDN ,我了解到GetKeyState
与当前线程的消息队列相关联。
然后,我创建了两个示例应用程序:KeyPresser
和BackChecker
。
我按KeyPresser
中的键,在此应用程序中,我使用 GetKeyState/GetAsyncKeyState/GetKeyboardState 来检索按下的键状态,他们告诉我该键正在按下。
然后,我以KeyPresser
的形式发送(或发布)消息到BackChecker
,通知BackChecker
检查其线程中的键状态。
我从BackChecker
获得了相同的结果,指示已按下该键。但是我认为 GetKeyState/GetKeyboardState 应该返回零,因为该键是在KeyPresser
线程中按下的,而该线程与BackChecker
线程无关。
为什么?
最佳答案
Windows上的键盘输入已缓冲。即使程序暂时没有响应,它也可以确保用户可以继续输入。在某种程度上,这种方式始终不会丢失键击。它们被添加到消息队列中,程序的消息循环稍后通过GetMessage()检索它们。
除击键外,它还存储所有其他键的状态。为确保最终检索到该消息时,您可以可靠地确定其他哪些键已按下。例如,对于修饰键非常重要。否则,像Ctrl + A这样的快捷键将无法可靠地工作。
因此,通常您总是使用GetKeyState()来获取键的原始记录状态。或GetKeyboardState(),您将获得整个墨西哥卷饼。使用GetAsyncKeyState()的情况要少得多,它不依赖于缓冲状态,仅在应用程序具有非常不寻常的消息处理时才需要。也许在游戏中是合适的。
关于c++ - GetKeyState和GetAsyncKeyState有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25891866/