如果我想使用扩展扫描代码(如0xE0 0x1D(右CTRL))来模拟按键,我将如何在C中模拟这样的按键?我尝试使用两个INPUT结构调用SendInput,但只有左按CTRL键被“按下”.在具有“twin”(Shift和Alt)的其他键的情况下也会发生同样的事情.
其次,如何为“扩展”键引起键盘事件?
最佳答案
KEYBDINPUT
结构有一个KEYEVENTF_EXTENDEDKEY标志来处理0xE0字节:
If specified, the scan code was preceded by a prefix byte that has the value 0xE0 (224).
尝试这样的事情:
INPUT inputs[2];
ZeroMemory(inputs, sizeof(inputs));
inputs[0].type = INPUT_KEYBOARD;
inputs[0].ki.wScan = 0x1D;
inputs[0].ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_EXTENDEDKEY;
CopyMemory(&inputs[1], &inputs[0], sizeof(INPUT));
inputs[1].ki.dwFlags |= KEYEVENTF_KEYUP;
SendInput(2, inputs, sizeof(INPUT));
但是,我建议使用虚拟密钥而不是扫描代码:
INPUT inputs[2];
ZeroMemory(inputs, sizeof(inputs));
inputs[0].type = INPUT_KEYBOARD;
inputs[0].ki.wVk = VK_CONTROL;
inputs[0].ki.dwFlags = KEYEVENTF_EXTENDEDKEY;
CopyMemory(&inputs[1], &inputs[0], sizeof(INPUT));
inputs[1].ki.dwFlags |= KEYEVENTF_KEYUP;
SendInput(2, inputs, sizeof(INPUT));
但是,如果您绝对需要扫描代码,至少要查看MapVirtualKey()
以将虚拟密钥转换为扫描代码:
inputs[0].type = INPUT_KEYBOARD;
inputs[0].ki.wScan = MapVirtualKey(VK_RCONTROL, MAPVK_VK_TO_VSC);
inputs[0].ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_EXTENDEDKEY;