我正在尝试在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项目
答案 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,您的代码将突然改变行为 - 这可能不是您想要做的。