我在一个代码示例中看到GetAsyncKeyState之后调查了{{3}}如何通过WASD键在屏幕上移动虚构角色。
我在MSDN页面上看到了这个:
返回值
输入: SHORT
如果函数成功,则返回值指定是否为键 自上次调用GetAsyncKeyState以来是否被按下,以及是否 密钥当前上升或下降。
如果设置了最高位,则 key为down,如果设置了最低有效位,则键为 在上一次调用GetAsyncKeyState之后按下。
我无法理解返回值的结构:
它说类型是short
,所以通过它我想你可以用二进制表示数字零,0000000000000000
或十六进制表示0x0000
(因为到目前为止)我知道一个十六进制数字代表四位二进制数字。
描述说按下键时应设置最高位。这让我觉得,如果设置了这个位,数字会显示如下:
1000000000000000
为了在我的程序中更好地使用它,我通过将其翻译为十六进制来缩短它,导致:
0x8000
因为十六进制中的8
应与二进制中的1000
对应。
当我看到所述机制在我的程序中不起作用时(无论键是否被按下,执行GetAsyncKeyState(chr) == 0x8000
总是会产生错误)我再看了一眼原始示例我看到了函数先雇用。在那里,将返回值与数字-32767
进行比较,当使用Windows计算器快速转换为十六进制时,会产生值0xFFFFFFFFFFFF8001
。现在,不要介意最后一个十六进制数字(1),因为这是用于检查最低有效位是否也是活动的位,但在我的情况下我不希望这样。
我在这里无法理解的事情如下:
1000000000000000
。我在这里错过了什么?答案 0 :(得分:3)
1 - 返回值为SHORT
,即16位= 2个字节。
2 - 最重要的位是第15位,因为如果将值转换为32位INT
,则值将被签名,16位1000 0000
值将变为1111 1111 1000 0000
(在64位) -bit world转换为1000 0000
- > 1111 1111 1111 1111 - 1111 1111 1000 0000
)。如果您只想测试有符号整数值的最高位,只需将其与零进行比较:
if(GetAsyncKeyState(...) < 0)
{
// Hey, MSB is set here!
}
答案 1 :(得分:3)
GetAsyncKeyState(chr) == 0x8000
这是不正确的检查。使用:
!!(GetAsyncKeyState(chr) & 0x8000)
查看是否设置了最高有效位。
值0xFFFFFFFFFFFF8001
与GetAsyncKeyState的实际返回值不对应。 Windows计算器不知道从GetAsyncKeyState返回的值的大小,因此它假定您正在使用64位数。您可以在其设置中覆盖它。