GetKeyState和GetAsyncKeyState有什么区别?

时间:2014-09-17 13:24:01

标签: c++ windows

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

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

我按下KeyPresser中的一个键,在此应用程序中,我使用 GetKeyState / GetAsyncKeyState / GetKeyboardState 来检索按下的键状态,并告诉我该键正在按下。

然后我将KeyPresser的消息发送(或发布)到BackChecker,以通知BackChecker检查其主题中的密钥状态。

我从BackChecker获得相同的结果表示按下了该键。但我认为 GetKeyState / GetKeyboardState 应该返回,因为在KeyPresser的线程中按下了该键,该线程与BackChecker的线程无关。

为什么吗

1 个答案:

答案 0 :(得分:3)

Windows上的键盘输入被缓冲。它确保用户可以继续输入,即使程序暂时无响应。在某种程度上,它总是不会丢失击键。它们被添加到消息队列中,程序的消息循环稍后使用GetMessage()检索它们。

除了击键,它还存储所有其他键的状态。为了确保在最终检索到消息时,您可以可靠地告知其他密钥已关闭。例如,对于修改键非常重要。像Ctrl + A这样的快捷键击不会可靠地工作。

因此,您通常总是使用GetKeyState(),您将获得最初记录的密钥的状态。或GetKeyboardState(),你得到整个辣酱玉米饼馅。使用GetAsyncKeyState()不太常见,它不依赖于缓冲状态,只有在应用程序具有非常不寻常的消息处理时才需要。也许在游戏中可能是合适的。