9

函数GetKeyState()返回一个 SHORT,其中包含键的状态(在高位向上/向下,在低位切换)。我如何获得这些值?

4

7 回答 7

13

简单的位操作将起作用。SHORT 是 16 位整数,因此要获得低位和高位,您可以执行以下操作:

lowBit = value & 1;
highBit = ((unsigned short) value) >> 15;

另外,请注意 LOBYTE 和 HIBYTE 宏用于将 SHORT 分解为低位和高位字节,而不是测试字节中的各个位。

于 2011-03-14T18:10:35.280 回答
11

这不是您使用 GetKeyState() 的返回值的方式。改为这样做:

SHORT state = GetKeyState(VK_INSERT);
bool down = state < 0;
bool toggle = (state & 1) != 0;
于 2011-03-14T18:16:05.987 回答
4

GetKeyState检查or结果的正常方法GetAsyncKeyState是按位与0x8000(binary 1000 0000 0000 0000)。

#define IS_DOWN( GetKeyState(x) & 0x8000 )
if( IS_DOWN( VK_ESCAPE ) ) // escape is down.
于 2012-12-26T03:36:30.977 回答
3

如果 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;
}
于 2018-02-07T21:24:13.857 回答
2
#define LOBYTE(a) ((CHAR)(a))
#define HIBYTE(a) ((CHAR)(((WORD)(a) >> 8) & 0xFF))
于 2011-03-14T18:06:41.390 回答
1

WORD == SHORT,HIWORD 适用于 DWORD,HIBYTE 适用于 SHORT/WORD。

于 2011-03-14T18:17:26.197 回答
0

GetKeyState当前返回SHORT数据类型,其中 typedef 来自short. short位于范围内–32,768 to 32,767。检测最高启用位(键已关闭)的一种方法是使其无符号,然后查询0x8000const 值。

另一种方法是将值保持为有符号并简单地将其与 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;
于 2018-01-22T12:36:12.783 回答