无法模拟Alt-Tab虚拟按键,可与其他按键一起使用

时间:2015-02-10 07:50:13

标签: c++ winapi windows-8 sendinput

我有一个简单的代码

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有什么特别之处吗?

1 个答案:

答案 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);
}
相关问题