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

时间:2011-10-25 21:06:04

标签: c++ binary hex return-value msdn

我在一个代码示例中看到GetAsyncKeyState之后调查了{{3}}如何通过WASD键在屏幕上移动虚构角色。

我在MSDN页面上看到了这个:

  

返回值

     

输入: SHORT

     

如果函数成功,则返回值指定是否为键   自上次调用GetAsyncKeyState以来是否被按下,以及是否   密钥当前上升或下降。

     

如果设置了最高位,则   key为down,如果设置了最低有效位,则键为   在上一次调用GetAsyncKeyState之后按下。

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

它说类型是short,所以通过它我想你可以用二进制表示数字零,0000000000000000或十六进制表示0x0000(因为到目前为止)我知道一个十六进制数字代表四位二进制数字。

描述说按下键时应设置最高位。这让我觉得,如果设置了这个位,数字会显示如下:

1000000000000000

为了在我的程序中更好地使用它,我通过将其翻译为十六进制来缩短它,导致:

0x8000

因为十六进制中的8应与二进制中的1000对应。

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

我在这里无法理解的事情如下:

  1. 为什么,如果一个十六进制数字表示四个二进制数字,并且该函数的输出值是一个短(两个字节),这里的数字由十六进制数字表示?那不是那八个字节吗?
  2. 返回值的描述表示如果按下键,最高位将设置为1,这使我相信该数字看起来像{{1} },而不是1000000000000000。我在这里错过了什么?

2 个答案:

答案 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位数。您可以在其设置中覆盖它。