使用SendInput发送两个或多个字符

时间:2015-07-08 23:09:59

标签: c++ winapi

要发送char,我们可以使用SendInput。如何使用它发送多个char?

我尝试了这段代码,但它没有发送任何内容:

function whatever (){
    var a       = 0,
        amodded = mod(a);
}

function mod(obj){
    return ++obj;
}

那么,正确的方法是什么?

3 个答案:

答案 0 :(得分:4)

SendInput()的第一个参数指定您传入的INPUT个结构的数量。您只传入1,但是您告诉SendInput()您传递了2. < / p>

您无法在单个INPUT中指定两个单独的虚拟键。您需要声明一个多个INPUT的数组,每个虚拟键一个,并且不要忘记为每个虚拟键包含2个INPUT - 一个用于keydown事件,一个用于keyup事件。因此,在您的示例中,您实际上需要4个INPUT来发送2个虚拟密钥,如@ user4581301的答案所示。

现在,关于KEYEVENTF_UNICODE,您不使用虚拟密钥,而是使用实际的Unicode代码点,使用UTF-16代码单元指定它们,每INPUT一个。这意味着如果你想发送一个需要UTF-16代理对的Unicode代码点,你需要2 INPUT s,一个用于高代理,一个用于低代理。警告是SendInput()文档中提到的 NOT ,但vScan字段是16位WORD,而{{1}事件生成KEYEVENTF_UNICODE消息,它将UTF-16代理代码单元作为单独的消息传递。

因此,要使用WM_CHAR发送一串Unicode字符,您可以执行以下操作:

KEYEVENTF_UNICODE

答案 1 :(得分:3)

如果我说得对,你想要更多的东西:

INPUT in[4] = {0}; // four inputs

// first input 0x53
in[0].type=INPUT_KEYBOARD;
in[0].ki.wScan=0;
in[0].ki.dwFlags=0;
in[0].ki.time=0;
in[0].ki.dwExtraInfo=0;
in[0].ki.wVk=0x53;

in[1] = in[0];
in[1].ki.dwFlags |= KEYEVENTF_KEYUP;

// second input 0x54
in[2].type=INPUT_KEYBOARD;
in[2].ki.wScan=0;
in[2].ki.dwFlags=0;
in[2].ki.time=0;
in[2].ki.dwExtraInfo=0;
in[2].ki.wVk=0x54;

in[3] = in[2];
in[3].ki.dwFlags |= KEYEVENTF_KEYUP;

SendInput(4,in,sizeof(INPUT));

可能希望将设置INPUT结构的grunt工作包装成函数以减少重复。

答案 2 :(得分:1)

其他答案似乎在 DirectX 游戏中不起作用。我在 TrackMania Nations 中测试了以下内容并且它工作正常:(记事本等也能正常工作)

#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <string>

void press_some_keys (std::string str) {
    INPUT input[2 * (int)str.size()] = {0};

    int cnt = 0;
    for (char ch: str) {
        input[cnt].type = INPUT_KEYBOARD;
        input[cnt].ki.dwFlags = KEYEVENTF_SCANCODE;
        input[cnt].ki.wScan = MapVirtualKey(LOBYTE(VkKeyScan(ch)), 0);
        cnt++;

        input[cnt] = input[cnt - 1];
        cnt++;
    }

    SendInput(2 * (int)str.size(), input, sizeof(INPUT));
    Sleep(10);

    for (cnt = 1; cnt < 2 * (int)str.size(); cnt += 2)
        input[cnt].ki.dwFlags |= KEYEVENTF_KEYUP;

    SendInput(2 * (int)str.size(), input, sizeof(INPUT));
}

我只测试了小写字母字符(没有箭头或其他),但对我来说已经足够了。

让它工作起来很痛苦,因为我发现最接近的是 Youtube 视频中的单击功能:-)