在我正在开发的程序中,我必须模拟击键,为此我使用SendInput()
方法,传递一个向量作为参数,该向量包含作为击键一部分的输入。我当前的代码似乎可以与我正在测试的所有组合正常工作(Alt 代码除外)。
这就是我目前所做的:
// Press ALT
input.type = INPUT_KEYBOARD;
input.ki.wVk = VK_LMENU;
input.ki.wScan = 0;
input.ki.dwFlags = 0;
input.ki.time = 0;
input.ki.dwExtraInfo = 0;
keystroke.push_back(input);
// Press NumPad2
input.type = INPUT_KEYBOARD;
input.ki.wVk = VK_NUMPAD2;
input.ki.wScan = 0;
input.ki.dwFlags = 0;
input.ki.time = 0;
input.ki.dwExtraInfo = 0;
keystroke.push_back(input);
// Release NumPad2
input.type = INPUT_KEYBOARD;
input.ki.wVk = VK_NUMPAD2;
input.ki.wScan = 0;
input.ki.dwFlags = KEYEVENTF_KEYUP;
input.ki.time = 0;
input.ki.dwExtraInfo = 0;
keystroke.push_back(input);
// Press NumPad1
input.type = INPUT_KEYBOARD;
input.ki.wVk = VK_NUMPAD1;
input.ki.wScan = 0;
input.ki.dwFlags = 0;
input.ki.time = 0;
input.ki.dwExtraInfo = 0;
keystroke.push_back(input);
// Release NumPad1
input.type = INPUT_KEYBOARD;
input.ki.wVk = VK_NUMPAD1;
input.ki.wScan = 0;
input.ki.dwFlags = KEYEVENTF_KEYUP;
input.ki.time = 0;
input.ki.dwExtraInfo = 0;
keystroke.push_back(input);
// Press NumPad2
input.type = INPUT_KEYBOARD;
input.ki.wVk = VK_NUMPAD2;
input.ki.wScan = 0;
input.ki.dwFlags = 0;
input.ki.time = 0;
input.ki.dwExtraInfo = 0;
keystroke.push_back(input);
// Release NumPad2
input.type = INPUT_KEYBOARD;
input.ki.wVk = VK_NUMPAD2;
input.ki.wScan = 0;
input.ki.dwFlags = KEYEVENTF_KEYUP;
input.ki.time = 0;
input.ki.dwExtraInfo = 0;
keystroke.push_back(input);
// Release ALT
input.type = INPUT_KEYBOARD;
input.ki.wVk = VK_LMENU;
input.ki.wScan = 0;
input.ki.dwFlags = KEYEVENTF_KEYUP;
input.ki.time = 0;
input.ki.dwExtraInfo = 0;
keystroke.push_back(input);
SendInput(keystroke.size(), &keystroke[0], sizeof(keystroke[0]));
The push_back
s 是在 a 中完成的for
循环,这就是为什么我完全重新定义了input
每次都有变化。
这种方法似乎适用于除 Alt 代码之外的所有组合。我怎样才能让它们也工作?谢谢。
PS:正如你所注意到的,dwFlags
从不声明ALT (VK_LMENU)
作为扩展密钥,因为仅根据我的理解VK_RMENU
(并不是VK_LMENU
) 就是这样。这个 MSDN 页面似乎证实了这一点。
使用扫描码代替虚拟按键。这会将按键注入到系统中的级别要低得多,并且比虚拟按键更可靠地模拟真实用户的输入。
我花了一段时间才找到最终的扫描代码列表,因为其中存在一些差异。但是引用中间大表中的“set 1”列这一页似乎有效。
INPUT createScanCodeEvent(WORD scancode, bool isDown)
{
INPUT input = {};
input.type = INPUT_KEYBOARD;
input.ki.wVk = 0;
input.ki.wScan = scancode;
input.ki.dwFlags = (isDown ? 0 : KEYEVENTF_KEYUP) | KEYEVENTF_SCANCODE;
input.ki.time = 0;
input.ki.dwExtraInfo = 0;
return input;
}
int inject()
{
std::vector<INPUT> keystroke;
const WORD SCANCODE_ALT = 0x38;
const WORD SCANCODE_NUMPAD_1 = 0x4f;
const WORD SCANCODE_NUMPAD_2 = 0x50;
keystroke.push_back(createScanCodeEvent(SCANCODE_ALT, true) );
keystroke.push_back(createScanCodeEvent(SCANCODE_NUMPAD_2, true));
keystroke.push_back(createScanCodeEvent(SCANCODE_NUMPAD_2, false));
keystroke.push_back(createScanCodeEvent(SCANCODE_NUMPAD_1, true));
keystroke.push_back(createScanCodeEvent(SCANCODE_NUMPAD_1, false));
keystroke.push_back(createScanCodeEvent(SCANCODE_NUMPAD_2, true));
keystroke.push_back(createScanCodeEvent(SCANCODE_NUMPAD_2, false));
keystroke.push_back(createScanCodeEvent(SCANCODE_ALT, false));
SendInput(keystroke.size(), keystroke.data(), sizeof(keystroke[0]));
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)