0

我正在尝试处理 Windows 7 中控制台的按键事件。当我按下左 ctrl 键时,我期望得到代码 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..
}

额外的位在哪里?

ps:unicode中的项目

4

2 回答 2

1

dwControlKeyState是位图。

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

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

要对其进行测试,请这样做:

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

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

于 2013-09-09T17:01:55.253 回答
1

如果要检查是否LEFT_CTRL_PRESSED处于活动状态,则应使用

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

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

于 2013-09-09T17:07:44.760 回答