我有一个简单的代码
KEYBDINPUT k1 = { VK_MENU, 0, 0, 0, 0 };
KEYBDINPUT k2 = { VK_TAB, 0, 0, 0, 0 };
KEYBDINPUT k3 = { VK_TAB, 0, KEYEVENTF_KEYUP, 0, 0 };
KEYBDINPUT k4 = { VK_MENU, 0, KEYEVENTF_KEYUP, 0, 0 };
int cnt = 0;
while (cnt < 10)
{
Sleep(1000);
INPUT in1 = { INPUT_KEYBOARD };
in1.ki = k1;
SendInput(1, &in1, sizeof(INPUT));
INPUT in2 = { INPUT_KEYBOARD };
in2.ki = k2;
INPUT in3 = { INPUT_KEYBOARD };
in3.ki = k3;
SendInput(1, &in2, sizeof(INPUT));
SendInput(1, &in3, sizeof(INPUT));
cnt++;
}
INPUT in4 = { INPUT_KEYBOARD };
in4.ki = k4;
SendInput(1, &in4, sizeof(INPUT));
return 0;
这不起作用。如果我从VK_TAB更改为VK_ESCAPE,则可以正常工作。
我想要模拟Alt-Tab,因为Alt-Esc没有可视化表示。 VK_TAB有什么特别之处吗?
答案 0 :(得分:0)
当VK失败时,使用带键盘扫描码的SendInput通常可以正常工作。
下面的示例演示了如何使用SendInput和键盘扫描码模拟alt-tab。
alt_tab函数需要计数。它将模拟按住左Alt键,按Tab键&#34; count&#34;时间,然后放开左侧的Alt键。
按键延迟相当大,主要是为了给你足够的时间来直观地展示效果。更短的延迟对于自动化更有效,但您可能无法完全删除它们。
我将1作为输入计数传递给SendInput,因为我只想一次发送一个。操作KEYBDINPUT时间戳并不像人们预期的那样工作。
要构建此示例,请从Win32控制台项目开始。
#include <Windows.h>
void sendkey(WORD scan_code, bool tf_down_up, bool extended=false) {
INPUT input = {0};
input.type = INPUT_KEYBOARD;
input.ki.wScan = scan_code;
input.ki.dwFlags = KEYEVENTF_SCANCODE;
if(!tf_down_up) input.ki.dwFlags |= KEYEVENTF_KEYUP;
if(extended) input.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY;
SendInput(1, &input, sizeof(input));
}
void keydown(WORD scan_code, bool extended=false) {
sendkey(scan_code, true, extended);
}
void keyup(WORD scan_code, bool extended=false) {
sendkey(scan_code, false, extended);
}
static const WORD TAB_SCANCODE = 0x0f;
static const WORD LEFT_ALT_SCANCODE = 0x38;
static const DWORD keypress_delay_ms = 500;
void alt_tab(int tab_count=1) {
keydown(LEFT_ALT_SCANCODE);
Sleep(keypress_delay_ms);
for(int i=0; i<tab_count; ++i) {
keydown(TAB_SCANCODE);
Sleep(keypress_delay_ms);
keyup(TAB_SCANCODE);
Sleep(keypress_delay_ms);
}
keyup(LEFT_ALT_SCANCODE);
}
int main() {
Sleep(1000);
alt_tab(3);
}