为什么按下的键的dwControlKeyState与常量不匹配?

时间:2013-09-09 16:59:16

标签: c++ c windows keyboard

我正在尝试在Windows 7中处理控制台的按键事件。 当我按下左按钮时,我希望得到代码0x0008(0b00001000 - LEFT_CTRL_PRESSED),但不是这样,我得到的是0x0028(0b00101000)。

...
DWORD n;
INPUT_RECORD ir;
HANDLE hin;
hin = GetStdHandler(STD_INPUT_HANDLE);
...
ReadConsoleInput(hin, &ir, 1, &n)...
...
if(ir.Event.KeyEvent.dwControlKeyState == LEFT_CTRL_PRESSED) {
// some code..
}

如果使用 xor 32 ,一切正常:

if((ir.Event.KeyEvent.dwControlKeyState ^ 32) == LEFT_CTRL_PRESSED) {
// some code..
}

额外的位在哪里?

p.s。:unicode项目

2 个答案:

答案 0 :(得分:1)

dwControlKeyState是位图。

dwControlKeyState的单个位同时描述某些键的状态。

第3个(0索引)位等于0x008,表示按下了左键控制键。

要测试它是这样的:

if (ir.Event.KeyEvent.dwControlKeyState & LEFT_CTRL_PRESSED) {
// some code..
}

有关此位图的完整说明,您可以在dwControlKeyState下阅读:http://msdn.microsoft.com/en-us/library/windows/desktop/ms684166%28v=vs.85%29.aspx

答案 1 :(得分:1)

如果您想检查LEFT_CTRL_PRESSED是否有效,则应使用

if (ir.Event.KeyEvent.dwControlKeyState & LEFT_CTRL_PRESSED)

因为dwControlKeyState包含几个表示不同内容的位。您的^ 32将反转NUMLOCK_ON位的值,因此如果您按下num-lock,您的代码将突然改变行为 - 这可能不是您想要做的。