MSDN ,我了解到GetKeyState与当前线程的消息队列相关联。

然后,我创建了两个示例应用程序:KeyPresserBackChecker

我按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/

10-09 03:40