使用SendInput函数模拟input

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

对内存位置的访问无效。

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

尝试

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

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

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

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

出于好奇,你试图模拟什么行动? 将用户输入“伪造”到任何应用程序通常不是一个非常优雅的做法。