应用程序块可以调用SendInput吗?

时间:2013-10-15 13:44:50

标签: winapi automation sendinput

有一款游戏我试图自动执行某些操作。

我过去使用SendInput非常成功。但是,使用此应用程序,我无法使鼠标单击工作。我已经使用其他应用程序测试了它,它都按预期工作。

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

旁注:我正在用C#编写代码并在Windows 7 x64上运行。我正在尝试与之交互的应用是x86。我不知道这是否有所作为?我正在测试我的代码与x64和x86应用程序交互。

1 个答案:

答案 0 :(得分:2)

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

如果查看SendInput的参数,则无法识别进程。输入发送到系统,而不是应用程序。应用程序无法分辨实际输入和合成输入之间的区别。

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

尽管SendInput以比DirectInput运行更低的级别注入输入,但DirectInput显然更容易受到错误代码的影响。请参阅Simulating Keyboard with SendInput API in DirectInput applications以供参考。

<小时/> 更新(2016-05-01):
除了UIPI的问题,防止输入到达应用程序,低级键盘/鼠标挂钩也可以识别注入的输入。 KBDLLHOOKSTRUCT(传递给LowLevelKeyboardProc回调)以及MSLLHOOKSTRUCT(传递给LowLevelMouseProc回调)都包含 flags 成员,设置LLKHF_INJECTEDLLMHF_INJECTED标志的情况,以防注入输入。

因此,应用程序可以安装一个低级键盘/鼠标挂钩来过滤掉注入的消息。如果是这种情况,可能的解决方法(无需编写键盘驱动程序)是在应用程序执行后安装低级键盘/鼠标挂钩,并防止输入到达应用程序的挂钩调用CallNextHookEx(以相反的顺序调用挂钩,从最后到第一个)。

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