【问题标题】:SendInput() function doesn't work inside game (C++)SendInput() 函数在游戏中不起作用(C++)
【发布时间】: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


【解决方案1】:

您使用的样本SendInput不正确。

首先,您只发送了一次 keydown 输入,然后当您清除输入(ZeroMemory)时,您还清除了typeki.wVk。你甚至没有为KEYEVENTF_KEYUP 打电话给SendInput

你只需要把keydown/up放在一个SendInput

INPUT input[2] = { 0 };

input[0].type = input[1].type = INPUT_KEYBOARD;
input[0].ki.wVk = input[1].ki.wVk = VkKeyScanA('a');

input[1].ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(2, input, sizeof(INPUT));

另外,此功能受 UIPI 约束。仅允许应用程序将输入注入到具有相同或更低完整性级别的应用程序中。对于这种情况,您需要set UIAccess in the Application Manifest File

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多