如何获得SHORT的高位和低位?

时间:2011-03-14 18:00:34

标签: c++ winapi short

函数GetKeyState()返回一个包含密钥状态的SHORT(高位中的上/下,以及低位切换)。我如何获得这些价值?

7 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:6)

这不是你如何使用GetKeyState()的返回值。这样做是这样的:

SHORT state = GetKeyState(VK_INSERT);
bool down = state < 0;
bool toggle = (state & 1) != 0;

答案 2 :(得分:3)

检查GetKeyStateGetAsyncKeyState结果的常规方法是按位 - 并使用0x8000(二进制1000 0000 0000 0000)。

#define IS_DOWN( GetKeyState(x) & 0x8000 )
if( IS_DOWN( VK_ESCAPE ) ) // escape is down.

答案 3 :(得分:2)

#define LOBYTE(a) ((CHAR)(a))
#define HIBYTE(a) ((CHAR)(((WORD)(a) >> 8) & 0xFF))

答案 4 :(得分:1)

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

答案 5 :(得分:0)

GetKeyState当前返回SHORT数据类型,来自short的typedef。 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

可以使用普通&#34;和&#34;来检查键切换。操作,如其他答案所述:

bool bIsKeyToggled = GetKeyState(VK_SHIFT) & 1;

答案 6 :(得分:0)

如果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;
}