【问题标题】:What is meant by "Shouldn't be relied upon" in GetAsyncKeyState() defnGetAsyncKeyState() defn 中的“不应依赖”是什么意思
【发布时间】:2012-11-25 01:13:48
【问题描述】:

From MSDN:

如果设置了最高有效位,则按键按下,如果设置了最低有效位,则在上一次调用 GetAsyncKeyState 后按键被按下。但是,您不应该依赖最后一种行为; [..]

虽然返回值的最低有效位指示自上次查询以来是否已按下键,但由于 Windows 的抢占式多任务性质,另一个应用程序可以调用 GetAsyncKeyState 并接收“最近按下”位而不是你的申请。严格保留返回值的最低有效位的行为是为了与 16 位 Windows 应用程序(非抢占式)兼容,不应依赖。

在我的程序中,我只对键当前关闭位置的返回值感兴趣。即,根据 msdn 的定义,当设置了最低和最高有效位 (-32767) 时(这就是它现在的工作方式。)。但是,我是否还必须检查 32767(没有最低 sig. 位的值)以防万一,就像它说的那样,最低有效位被另一个程序截获,或者“不可靠”,无论这意味着什么。

【问题讨论】:

  • 注意“最高有效位”。所以只需使用bool leftShiftDown = GetAsyncKeyState(VK_LSHIFT) < 0;

标签: c++ winapi


【解决方案1】:

嗯,是的,基本上。不过,只检查最重要的位并完全忽略最不重要的位更容易。

我还必须检查 32767(没有最少 sig. 位的值)

这是不对的 - 值将是 -32768(假设二进制补码):

1000 0000 0000 0001   -32767
1000 0000 0000 0000   -32768

另见here;我很奇怪这个值被打包到short 中,但是我们开始了。

【讨论】:

  • 我想知道为什么它也很短。由于某种原因,我的代码不能像以前那样工作。有什么事情发生了。
  • 所以正确的方法似乎是-32767||-32768,谢谢指正!否则,(例如,只有 -32768)它似乎表现得像普通的 Windows 键输入,当按住 p 时它是 (p....p.p.p.p.p) 而不是 (ppppppppppppppp) 后者是我想要的。
  • @Chimps:只要检查ANDed 和-32768 的值是否可以转换为true :)
  • 现在是short,因为位模式是在intshort 具有相同大小(16 位Windows)时定义的。
  • @BoPersson:但是,我认为,显然单个字节甚至比此目的所需的还要大四倍。
【解决方案2】:

GetAsyncKeyState() 尝试确定自上次调用它以来它是否被按下,这使得它不可靠。其他东西可能已经调用并有效地重置了该标志,因此您将永远不会收到它。

【讨论】:

  • 你完全搞反了。
猜你喜欢
  • 2018-04-10
  • 2016-03-17
  • 2020-12-04
  • 2014-04-20
  • 2011-08-05
  • 2019-03-28
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多