函数GetKeyState()返回一个 SHORT,其中包含键的状态(在高位向上/向下,在低位切换)。我如何获得这些值?
7 回答
简单的位操作将起作用。SHORT 是 16 位整数,因此要获得低位和高位,您可以执行以下操作:
lowBit = value & 1;
highBit = ((unsigned short) value) >> 15;
另外,请注意 LOBYTE 和 HIBYTE 宏用于将 SHORT 分解为低位和高位字节,而不是测试字节中的各个位。
这不是您使用 GetKeyState() 的返回值的方式。改为这样做:
SHORT state = GetKeyState(VK_INSERT);
bool down = state < 0;
bool toggle = (state & 1) != 0;
GetKeyState
检查or结果的正常方法GetAsyncKeyState
是按位与0x8000
(binary 1000 0000 0000 0000
)。
#define IS_DOWN( GetKeyState(x) & 0x8000 )
if( IS_DOWN( VK_ESCAPE ) ) // escape is down.
如果 Google 在尝试查找有关GetKeyboardState()
而不是 的信息时像我一样将您带到这里,请注意它作用于BYTEGetKeyState()
数组,而不是SHORT。
- 如果你选择按位
AND
,你应该使用0x80
,而不是0x8000
. - 如果您转移,请使用
>> 7
,而不是>> 15
。
例如,要确定任一 CTRL 键是否按下:
BYTE keyboardState[256];
GetKeyboardState(keyboardState);
if (keyboardState[VK_CONTROL] & 0x80)
{
std::cout << "control key!" << std::endl;
}
#define LOBYTE(a) ((CHAR)(a))
#define HIBYTE(a) ((CHAR)(((WORD)(a) >> 8) & 0xFF))
WORD == SHORT,HIWORD 适用于 DWORD,HIBYTE 适用于 SHORT/WORD。
GetKeyState
当前返回SHORT
数据类型,其中 typedef 来自short
.
short
位于范围内–32,768 to 32,767
。检测最高启用位(键已关闭)的一种方法是使其无符号,然后查询0x8000
const 值。
另一种方法是将值保持为有符号并简单地将其与 0 进行比较。
bool bIsKeyDown = GetKeyState(VK_SHIFT) < 0;
就像这里提到的:https ://stackoverflow.com/a/5789914/2338477
所有负值都启用最高位,因为所有正值和零都禁用最高位。
这是 char 的示例表,但同样适用于短数据类型,只是表会稍大一些。
bits value
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 -8
1001 -7
1010 -6
1011 -5
1100 -4
1101 -3
1110 -2
1111 -1
并且可以使用正常的“和”操作来检查键切换,就像这里的其他答案提到的那样:
bool bIsKeyToggled = GetKeyState(VK_SHIFT) & 1;