我调查了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,这让我相信数字看起来像
1000000000000000
,而不是0000000000001000
。我在这里缺少什么?
最佳答案
GetAsyncKeyState(chr) == 0x8000
这是错误的检查。使用:
!!(GetAsyncKeyState(chr) & 0x8000)
查看是否设置了最高有效位。
值 0xFFFFFFFFFFFF8001
与 GetAsyncKeyState 的实际返回值不对应。 Windows 计算器不知道从 GetAsyncKeyState 返回的值的大小,因此它假定您使用的是 64 位数字。您可以在其设置中覆盖它。
关于c++ - GetAsyncKeyState 的返回值似乎与描述不符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7895888/