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

GetAsyncKeyState's return values don't seem to correspond with the description

本文关键字:描述 返回值 GetAsyncKeyState      更新时间:2023-10-16

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

我是在它的MSDN页面上看到的:

<

类型:短/em>

如果函数成功,返回值指定键是否自从上次调用GetAsyncKeyState以来被按下,以及是否

如果设置了最高位,则密钥为下,如果设置了最低有效位,则密钥为

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

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

说明说按下该键时应设置最高有效位。这让我想到,如果设置了said位,这个数字应该是这样的:

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位数字。您可以在其设置中重写它

1 -返回值为SHORT,即16比特= 2字节。

2 -最高有效位是第15位,因为如果将其转换为32位INT,则16位1000 0000的值将变为1111 1111 1000 0000(在64位世界中转换为1000 0000 -> 1111 1111 1111 1111 - 1111 1111 1000 0000)。如果您只想测试有符号整数值的最高位,只需将其与零比较:

if(GetAsyncKeyState(...) < 0)
{
  // Hey, MSB is set here!
}