函数GetKeyState()返回一个包含密钥状态的SHORT(高位中的上/下,以及低位切换)。我如何获得这些价值?
答案 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)
检查GetKeyState
或GetAsyncKeyState
结果的常规方法是按位 - 并使用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;
}