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