1

下面的程序没有做任何事情,尽管预计会模拟每秒按“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)

对内存位置的无效访问。

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

4

1 回答 1

2

尝试

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

并检查返回值是否非零。事实上,它应该等于发送的输入数,在本例中为 4。

如果被另一个线程或 UIPI(用户界面特权隔离)阻塞,该函数可能会失败

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

出于好奇,您要模拟什么动作?对任何应用程序“伪造”用户输入通常不是一种非常优雅的做法。

于 2012-08-10T20:00:11.170 回答