c++ - GetAsyncKeyState 的返回值似乎与描述不符

标签 c++ binary hex return-value msdn

我调查了GetAsyncKeyState在关于如何通过 WASD 键使虚构角色在屏幕上移动的代码示例中看到它之后。

我在它的 MSDN 页面上读到了这个:

Return value

Type: SHORT

If the function succeeds, the return value specifies whether the key was pressed since the last call to GetAsyncKeyState, and whether the key is currently up or down.

If the most significant bit is set, the key is down, and if the least significant bit is set, the key was pressed after the previous call to GetAsyncKeyState.

我无法理解返回值的结构:

它说类型是 short,所以我想通过它你可以将数字零表示为二进制,如 0000000000000000,或十六进制如 0x0000 (据我所知,一个十六进制数字代表四个二进制数字)。

描述说最高有效位应该在按键被按下时设置。这让我觉得,如果设置了上述位,数字将如下所示:

1000000000000000

为了在我的程序中更好地使用它,我通过将它转换为十六进制来缩短它,结果为:

0x8000

因为十六进制的8应该对应二进制的1000

当我看到上述机制在我的程序中不起作用时(执行 GetAsyncKeyState(chr) == 0x8000 总是会产生 false,无论按键是否被按下)我又拿了一个查看原始示例,我首先看到了使用的功能。在那里,返回值与数字 -32767 进行比较,当使用 Windows 计算器将其快速转换为十六进制时,结果为值 0xFFFFFFFFFFFF8001。现在,不要介意最后一个十六进制数字 (1),因为这是用于检查最低有效位是否也处于事件状态的位,但在我的情况下我不希望这样。

这里我无法理解的地方如下:

  1. 为什么,如果一个十六进制数字表示四个二进制数字,并且函数的输出值是一个短整型(两个字节),这里的数字由十六个十六进制数字表示?这不是八个字节吗?
  2. 返回值的描述说如果按键被按下,最高有效位将被设置为 1,这让我相信数字看起来像 1000000000000000 ,而不是 0000000000001000。我在这里缺少什么?

最佳答案

GetAsyncKeyState(chr) == 0x8000

这是错误的检查。使用:

!!(GetAsyncKeyState(chr) & 0x8000)

查看是否设置了最高有效位。

0xFFFFFFFFFFFF8001 与 GetAsyncKeyState 的实际返回值不对应。 Windows 计算器不知道从 GetAsyncKeyState 返回的值的大小,因此它假定您使用的是 64 位数字。您可以在其设置中覆盖它。

关于c++ - GetAsyncKeyState 的返回值似乎与描述不符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7895888/

相关文章:

java - 将二进制 1 和 0 的整数(或字符串)数组转换为 Java 中的 alpha 等价物

mysql - 将十六进制值插入 MySql

excel - 将 Hex 文件转换为 Excel 文件

python - 在 python 中将十六进制转换为 BCD

java - 二进制转十进制,错误信息

c - printf 原始数据到固定长度的十六进制输出

C++ "while"解释

android - 在 Android NDK r8b 下编译 STXXL

c++ - 在 C++ 中实现工厂方法的首选方法是什么?

c++ - 无法使用 FindWindowExA() 找到子窗口