GetKeyState和GetAsyncKeyState有什么区别?

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

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

我按KeyPresser一个键,在这个应用程序中,我使用GetKeyState / GetAsyncKeyState / GetKeyboardState检索按下的键状态,他们告诉我,按下键。

然后我发送(或发布)一个消息formsKeyPresserBackChecker ,通知BackChecker检查它的线程中的关键状态。

我从BackChecker获得相同的结果表明按下了键。 但是我认为GetKeyState / GetKeyboardState应该返回零,因为在KeyPresser线程中键被按下,而不是与BackChecker线程相关联。

为什么?

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

随着击键,它也存储所有其他键的状态。 为了确保在最终检索到消息时,可以可靠地告诉别的关键是什么。 例如对于修饰键非常重要。 如Ctrl + A的快捷键操作将无法正常工作。

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