1

有一个游戏,我正在尝试自动执行一些操作。

我过去非常成功地使用过SendInput。但是,使用此应用程序,我无法通过鼠标单击来工作。我已经使用其他应用程序对其进行了测试,并且一切都按预期工作。

应用程序可以阻止我使用 SendInput 吗?如果是这样,我能以某种方式绕过它吗?

旁注:我正在用 C# 编写代码并在 Windows 7 x64 上运行。我试图与之交互的应用程序是 x86。不知道这样有没有区别?我已经测试了与 x64 和 x86 应用程序交互的代码。

4

1 回答 1

3

简短回答:不。(不是对 的调用SendInput,但可以过滤输入。请参阅下面的更新。)

如果您查看参数,SendInput则没有任何东西可以识别过程。输入被发送到系统,而不是应用程序。应用程序无法区分真实输入和合成输入。

应用程序不响应合成输入的原因有很多。如文档中所述,SendInput此 API 受 UIPI 约束。以比应用程序调用更高的完整性级别运行的应用程序SendInput将不会收到此输入。

尽管SendInput注入输入的级别低于 DirectInput 运行,但 DirectInput 显然更容易受到错误代码的影响。请参阅在 DirectInput 应用程序中使用 SendInput API 模拟键盘以供参考。


更新 (2016-05-01):
除了 UIPI 的问题,阻止输入到达应用程序,低级键盘/鼠标挂钩也可以识别注入的输入。KBDLLHOOKSTRUCT (传递给LowLevelKeyboardProc回调)和MSLLHOOKSTRUCT(传递给LowLevelMouseProc回调)都包含一个标志成员,它们设置了or标志,以防输入被注入。LLKHF_INJECTEDLLMHF_INJECTED

因此,应用程序可以安装一个低级键盘/鼠标挂钩来过滤掉注入的消息。如果是这种情况,一个潜在的解决方法(不编写键盘驱动程序)是,在应用程序安装低级键盘/鼠标钩子之后,通过不调用来防止输入到达应用程序的钩子CallNextHookEx(钩子被反向调用它们的安装顺序,从最后到第一个)。

注意:解决方法是故意使已安装的挂钩短路,从而可能会破坏其他应用程序。此外,如果一个应用程序决定实现一个低级钩子来过滤注入的输入,它也可以通过频繁地将自身重新安装到钩子链的顶部来防止竞争的低级钩子,这使得解决方法变得无用。 .

于 2013-10-15T14:10:33.183 回答