下面的程序没有做任何事情,尽管预计会模拟每秒按“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)
Invalid access to memory location.
但我不知道是什么原因造成的。
最佳答案
尝试
SendInput(INPUTS, inputArray, sizeof(INPUT));
并检查返回值是否为非零。事实上,它应该等于发送的输入数,在本例中为 4。
如果被另一个线程或 UIPI ( User Interface Privilege Isolation ) 阻塞,该函数可能会失败
为避免其他问题,您可能需要检查当前键盘状态以及 SendInput
添加到输入流,而在运行时按下其他键可能会干扰它。
出于好奇,您要模拟什么 Action ? “伪造”用户对任何应用程序的输入通常不是一种非常优雅的做法。
关于c++ - 使用 SendInput 函数模拟输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11908262/