如果我想使用像 0xE0 0x1D 这样的扩展扫描码(对于右 CTRL)来模拟按键,我将如何在 C 中模拟这样的按键?我试过用两个 SendInput
结构调用 INPUT
,但只有左 CTRL 键被“按下”。同样的事情发生在具有“双胞胎”(Shift 和 Alt)的其他键的情况下。
其次,如何导致“扩展”键的 keyup 事件?
最佳答案
KEYBDINPUT
结构有一个 KEYEVENTF_EXTENDEDKEY
标志来为你处理 0xE0
字节:
尝试这样的事情:
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;
关于c - Winapi - 扩展键盘扫描码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36972524/