使用SendInput函数模拟输入

时间:2012-08-10 19:45:22

标签: c++ windows winapi

以下程序没有做任何事情,预计模拟每秒按“a”和“b”。为什么它不起作用?

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

using namespace std;

const int INPUTS = 4;

int main()
{
    INPUT inputArray[INPUTS];

    INPUT input;

    input.type = INPUT_KEYBOARD;

    //Press 'a' key
    input.ki.wVk = 0x41;
    input.ki.wScan = MapVirtualKey(0x41,MAPVK_VK_TO_VSC);
    inputArray[0] = input;

    //Release 'a' key
    input.ki.dwFlags = KEYEVENTF_KEYUP;
    inputArray[1] = input;


    //Press 'b' key
    input.ki.dwFlags = 0;
    input.ki.wVk = 0x42;
    input.ki.wScan = MapVirtualKey(0x42,MAPVK_VK_TO_VSC);
    inputArray[2] = input;

    //Release 'b' key
    input.ki.dwFlags = KEYEVENTF_KEYUP;
    inputArray[3] = input;

    Sleep(5000);

    std::cout<<"GO!!!\n";

    for(int i=0; i<100; i++)
    {
        SendInput(sizeof(inputArray),inputArray,sizeof(INPUT));
        Sleep(1000); //Don't remove!
    }       

    std::cout<<GetLastError()<<std::endl;

    system("Pause");
    return 0;
}

最后一个错误是

  

ERROR_NOACCESS

     

998(0x3E6)

     

对内存位置的无效访问。

但我不知道是什么造成的。

1 个答案:

答案 0 :(得分:2)

尝试

SendInput(INPUTS, inputArray, sizeof(INPUT));

并检查返回值是否为非零。实际上,它应该等于发送的输入数量,在这种情况下为4。

如果被另一个线程或UIPI(User Interface Privilege Isolation

阻止,该函数可能会失败

为了避免其他问题,您可能需要检查当前的键盘状态以及SendInput添加到输入流以及正在运行时按下的其他键可能会干扰它。

出于好奇,你想要模拟什么动作?它通常不是一个非常优雅的做法,假装&#34;用户对任何应用程序的输入。