GetAsyncKeyState 的返回值似乎与描述不符
GetAsyncKeyState's return values don't seem to correspond with the description
我在一个关于如何通过WASD键使虚构角色在屏幕上移动的代码示例中看到它后,研究了GetAsyncKeyState。
我是在它的MSDN页面上看到的:
返回值strong>
<类型:短/em>
如果函数成功,返回值指定键是否自从上次调用GetAsyncKeyState以来被按下,以及是否
如果设置了最高位,则密钥为下,如果设置了最低有效位,则密钥为
我无法理解返回值的结构:
它说类型是short
,所以通过它,我想你可以将数字0表示为二进制的0000000000000000
,或者十六进制的0x0000
(因为据我所知,一个十六进制数字代表四个二进制数字)。
说明说按下该键时应设置最高有效位。这让我想到,如果设置了said位,这个数字应该是这样的:
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位数字。您可以在其设置中重写它
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!
}
- 从python中调用C++函数并获取返回值
- 为什么模板类中的对象不能返回值
- 返回值优化:显式移动还是隐式
- lock_guard是否保护返回值
- 调用CreateProcess()并获取字符串的返回值
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 查找 GCD:并非所有控制路径都返回值
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 如何从 std::thread 返回值
- 将返回值从 exe 传递到 bat,并将其传递给 C# 中的进程
- 方法错误"not all control paths return a value"和方法不返回值
- 如何读取 C++ SAFEARRAY**,该 SAFEARRAY** 是 COM 互操作的结果,其中 C# 返回值为
- 对fread的返回值感到困惑
- 程序不向函数返回值
- 如何在另一个函数中使用返回值作为参数?
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 使用 std::p air 进行返回值优化
- GetAsyncKeyState 的返回值似乎与描述不符