【发布时间】:2021-01-24 14:34:35
【问题描述】:
我用 C++ 编写了一个 AI 来尝试玩游戏(Puyo Puyo Tetris),为此,我尝试使用 SendInput() 来模拟键盘输入来控制游戏,但由于某种原因,输入不什么都不做。我知道输入本身可以工作,因为它们在记事本和浏览器等外部工作。我怀疑这可能是游戏阻止 SendInput() 函数在游戏内部通过的反作弊的一部分。
这是我的代码:
INPUT input = {0};
input.type = INPUT_KEYBOARD;
input.ki.wVk = VkKeyScanA('a');
SendInput(1, &input, sizeof(input));
Sleep(100);
ZeroMemory(&input, sizeof(input));
input.ki.dwFlags = KEYEVENTF_KEYUP;
Sleep(5);
有谁知道如何解决这个问题?我可以使用 SendInput() 的替代方法吗?谢谢!
【问题讨论】:
-
您需要消除 用户界面特权隔离 (UIPI) 作为问题的原因。另见"...这个函数[SendInput]在被UIPI阻塞时失败。注意GetLastError和返回值都不会表明失败是由UIPI阻塞引起的......" @987654321 @
-
嗯,有没有办法绕过它?
-
我不知道,它甚至可能不是问题的真正原因。
-
这不是您使用 SendInput 的方式。永远不要在第一个参数中发送 1。将它们批处理成一个数组。可能但是游戏不想要作弊。这里有数千篇关于这个主题的帖子。搜索它们。
-
SendInput旨在用于辅助技术,如屏幕键盘、语音控制软件等。它的实现针对该用例进行了优化,向输入接收器提供所需的尽可能多的信息.该信息包括输入已生成的事实。客户很容易过滤掉注入的输入,从而使游戏能够保护自己免受幼稚的作弊尝试。如果你想成为一个更好的骗子,你将不得不投入很多更多的研究工作。
标签: c++ winapi artificial-intelligence sendinput