INPUT / vector数组不适用于SendInput

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了INPUT / vector数组不适用于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);
}

以上是关于INPUT / vector数组不适用于SendInput的主要内容,如果未能解决你的问题,请参考以下文章

为啥 fill_n() 不适用于 vector.reserve()?

为啥排序不适用于矢量?

验证不适用于 INTL-TEL-INPUT

为啥相同的语句不适用于 C++ 中的类成员?

`innerHTML` 不适用于 `input` 标签,但 `value` 可以

函数适用于文本输入,但不适用于数字输入