【发布时间】:2011-07-15 05:15:33
【问题描述】:
函数GetKeyState() 返回一个包含键状态的SHORT(高位向上/向下,低位切换)。我如何获得这些值?
【问题讨论】:
函数GetKeyState() 返回一个包含键状态的SHORT(高位向上/向下,低位切换)。我如何获得这些值?
【问题讨论】:
简单的位操作就可以了。 SHORT 是 16 位整数,因此要获取低位和高位,您可以执行以下操作:
lowBit = value & 1;
highBit = ((unsigned short) value) >> 15;
另外,请注意,LOBYTE 和 HIBYTE 宏用于将 SHORT 分解为低位和高位字节,而不是测试字节中的各个位。
【讨论】:
0x8000 进行 AND 而非位移更为常见。
这不是您使用 GetKeyState() 的返回值的方式。改为这样做:
SHORT state = GetKeyState(VK_INSERT);
bool down = state < 0;
bool toggle = (state & 1) != 0;
【讨论】:
检查GetKeyState 或GetAsyncKeyState 的结果的正常方法是按位与0x8000(二进制1000 0000 0000 0000)。
#define IS_DOWN( GetKeyState(x) & 0x8000 )
if( IS_DOWN( VK_ESCAPE ) ) // escape is down.
【讨论】:
#define LOBYTE(a) ((CHAR)(a))
#define HIBYTE(a) ((CHAR)(((WORD)(a) >> 8) & 0xFF))
【讨论】:
如果 Google 在尝试查找 GetKeyboardState() 而不是 GetKeyState() 的信息时像我一样将您带到这里,请注意它作用于 BYTE 数组,而不是 SHORT。
AND,则应使用0x80,而不是0x8000。>> 7,而不是>> 15。例如,要确定是否有任何一个 CTRL 键按下:
BYTE keyboardState[256];
GetKeyboardState(keyboardState);
if (keyboardState[VK_CONTROL] & 0x80)
{
std::cout << "control key!" << std::endl;
}
【讨论】:
WORD == SHORT,HIWORD 适用于 DWORD,HIBYTE 适用于 SHORT/WORD。
【讨论】:
GetKeyState 当前返回SHORT 数据类型,该类型定义来自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;
【讨论】: