输入/向量数组不适用于 SendInput

Array of INPUT / vector doesn't work with SendInput

所以我正在尝试使用 SendInput 以便同时发送多个按键/按键释放。数组和向量具有正确的信息,但由于某种原因,它只是没有按下任何东西。为什么?

我试过从数组和向量中选取一个元素并使用 SendInput 按下/释放按键,效果很好。

#include <iostream>
#include <Windows.h>
#include <vector>

class movement
{
public:
    std::vector<INPUT> inputs;

    void Key(std::vector<INPUT> INPUTkeys)
    {
        INPUT * inputs = new INPUT[INPUTkeys.size()];

        for (int i = 0; i < INPUTkeys.size(); i++)
            inputs[i] = INPUTkeys.at(i);

        SendInput(INPUTkeys.size(), inputs, sizeof(inputs));

        delete[] inputs;
    }

    void prepareInput(INPUT &input, int key, bool down)
    {
        input.type = INPUT_KEYBOARD;
        input.ki.dwExtraInfo = NULL;
        input.ki.time = NULL;
        input.ki.wScan = NULL;
        input.ki.wVk = key;

        if (down)
            input.ki.dwFlags = 0;
        else
            input.ki.dwFlags = KEYEVENTF_KEYUP;
    }
};

movement oMovement;

void main()
{
    while (!GetAsyncKeyState(VK_SPACE))
        Sleep(1);

    std::vector<INPUT> inputs;

    INPUT input;

    oMovement.prepareInput(input, 'U', true);
    inputs.push_back(input);
    oMovement.prepareInput(input, 'S', true);
    inputs.push_back(input);
    oMovement.prepareInput(input, 'X', true);
    inputs.push_back(input);

    oMovement.Key(inputs);
    inputs.clear();

    oMovement.prepareInput(input, 'U', false);
    inputs.push_back(input);
    oMovement.prepareInput(input, 'S', false);
    inputs.push_back(input);
    oMovement.prepareInput(input, 'X', false);
    inputs.push_back(input);

    oMovement.Key(inputs);
    inputs.clear();

    system("pause");
}

您将指针的大小作为第三个参数传递给 SendInput,而它应该是 INPUT 结构的大小。您还应该检查结果(至少在调试模式下):

void Key(std::vector<INPUT> & INPUTkeys) // pass by reference to prevent copying
{
   ::UINT const sent_events_count
   {
       SendInput
       (
           static_cast<::UINT>(INPUTkeys.size())
       ,   INPUTkeys.data()
       ,   sizeof ::INTPUT
       )
   };
   assert(INPUTkeys.size() == sent_events_count);
}