以下程序没有做任何事情,预计模拟每秒按“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)
对内存位置的无效访问。
但我不知道是什么造成的。
答案 0 :(得分:2)
尝试
SendInput(INPUTS, inputArray, sizeof(INPUT));
并检查返回值是否为非零。实际上,它应该等于发送的输入数量,在这种情况下为4。
如果被另一个线程或UIPI(User Interface Privilege Isolation)
阻止,该函数可能会失败为了避免其他问题,您可能需要检查当前的键盘状态以及SendInput
添加到输入流以及正在运行时按下的其他键可能会干扰它。
出于好奇,你想要模拟什么动作?它通常不是一个非常优雅的做法,假装&#34;用户对任何应用程序的输入。