从 MSDN ,我了解到GetKeyState
与当前线程的消息队列相关联。
然后我创建了两个示例应用程序:KeyPresser
和BackChecker
。
我按下KeyPresser
中的一个键,在此应用程序中,我使用 GetKeyState / GetAsyncKeyState / GetKeyboardState 来检索按下的键状态,并告诉我该键正在按下。
然后我将KeyPresser
的消息发送(或发布)到BackChecker
,以通知BackChecker
检查其主题中的密钥状态。
我从BackChecker
获得相同的结果表示按下了该键。但我认为 GetKeyState / GetKeyboardState 应该返回零,因为在KeyPresser
的线程中按下了该键,该线程与BackChecker
的线程无关。
为什么吗
答案 0 :(得分:3)
Windows上的键盘输入被缓冲。它确保用户可以继续输入,即使程序暂时无响应。在某种程度上,它总是不会丢失击键。它们被添加到消息队列中,程序的消息循环稍后使用GetMessage()检索它们。
除了击键,它还存储所有其他键的状态。为了确保在最终检索到消息时,您可以可靠地告知其他密钥已关闭。例如,对于修改键非常重要。像Ctrl + A这样的快捷键击不会可靠地工作。
因此,您通常总是使用GetKeyState(),您将获得最初记录的密钥的状态。或GetKeyboardState(),你得到整个辣酱玉米饼馅。使用GetAsyncKeyState()不太常见,它不依赖于缓冲状态,只有在应用程序具有非常不寻常的消息处理时才需要。也许在游戏中可能是合适的。