有一款游戏我试图自动执行某些操作。
我过去使用SendInput非常成功。但是,使用此应用程序,我无法使鼠标单击工作。我已经使用其他应用程序测试了它,它都按预期工作。
应用程序可以阻止我使用SendInput吗?如果是这样,我能以某种方式绕过它吗?
旁注:我正在用C#编写代码并在Windows 7 x64上运行。我正在尝试与之交互的应用是x86。我不知道这是否有所作为?我正在测试我的代码与x64和x86应用程序交互。
答案 0 :(得分:2)
简短回答:否。(不是对SendInput
的来电,但可以过滤输入。请参阅下面的更新。)
如果查看SendInput
的参数,则无法识别进程。输入发送到系统,而不是应用程序。应用程序无法分辨实际输入和合成输入之间的区别。
应用程序无法响应合成输入的原因有很多。正如SendInput
的文档中所解释的,此API受UIPI约束。运行在比调用SendInput
的应用程序更高的完整性级别的应用程序将不会收到此输入。
尽管SendInput
以比DirectInput运行更低的级别注入输入,但DirectInput显然更容易受到错误代码的影响。请参阅Simulating Keyboard with SendInput API in DirectInput applications以供参考。
<小时/> 更新(2016-05-01):
LLKHF_INJECTED
或LLMHF_INJECTED
标志的情况,以防注入输入。
因此,应用程序可以安装一个低级键盘/鼠标挂钩来过滤掉注入的消息。如果是这种情况,可能的解决方法(无需编写键盘驱动程序)是在应用程序执行后安装低级键盘/鼠标挂钩,并防止输入到达应用程序的挂钩调用CallNextHookEx
(以相反的顺序调用挂钩,从最后到第一个)。
注意:解决方法是故意使安装的挂钩短路,从而可能会破坏其他应用程序。此外,如果一个应用程序决定实现一个低级别的钩子来过滤掉注入的输入,那么它可以通过频繁地将自己重新安装到钩子链的顶部来防止竞争的低级别钩子,这使得解决方法变得无用