【问题标题】:GetKeyboardState return wrong resultGetKeyboardState 返回错误结果
【发布时间】:2013-03-01 15:55:05
【问题描述】:

我使用的是 64 位的 win7。 我使用 GetKeyboardState() 来获取键盘状态。

BYTE keyState[256];
GetKeyboardState(keyState);
BOOL leftButtonClicked = GetKeyState(VK_LBUTTON);

如果在主wnd里面点击,一切正常,但是如果在主wnd外面点击,leftButtonClicked仍然是真的。

msdn 说,

应用程序可以调用此函数来检索所有虚拟键的当前状态。当线程从其消息队列中删除键盘消息时,状态会发生变化。状态不会随着键盘消息被发布到线程的消息队列而改变,也不会随着键盘消息被发布到其他线程的消息队列或从其他线程的消息队列中检索而改变。

但是 main wnd 没有收到 WM_LBUTTONDOWN,那么为什么这个函数会得到错误的结果呢? 还是我误解了什么?

谢谢。

【问题讨论】:

  • 这不是“错误的结果”,而是“您还没有检查鼠标在哪里”——只有当它在您的窗口内发生某些事情时,您才会得到 VM_LBUTTONDOWN。但是 GetKeyState 是通用的 - 它会告诉您询问时的状态,它是否与您的窗口相关取决于您的应用程序来确定。
  • 我很困惑。你永远不会看 GetKeyboardState 的结果。

标签: c++ winapi


【解决方案1】:

GetKeyboardState 和 GetKeyState 返回键盘和鼠标的缓冲状态。当最后一个输入事件进入消息队列时存储。一个重要的功能是,如果程序不发送消息,消息可以在队列中存储一段时间。

当您在窗口外单击时,生成的输入事件会转到与您单击的窗口相关联的任何队列。不是您的程序的队列。因此,键盘状态不会改变。

您需要使用 GetAsyncKeyState() 来获取当前状态。

【讨论】:

    猜你喜欢
    • 2021-05-05
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多