c#移动鼠标没有焦点就无法工作

时间:2014-01-01 09:20:22

标签: c# mouse sendinput

我想移动鼠标并在我的应用程序之外模拟鼠标点击。

我已经尝试了一切可能的方法来移动鼠标,sendinput,大量的库,包括BotSuite和输入模拟器。

每当我的应用程序失去焦点时,它不会移动鼠标,也不会点击。 我可以移动鼠标,然后在我的应用程序中单击,但是一旦我失去焦点,它就会完全停止工作。即使在聚焦时,我也无法点击我的应用程序之外的任何内容。

为什么?

这是使用BotSuite的代码段。我在此之前开始了一个过程并将其作为重点。

        Bitmap CapturedScreen = ScreenShot.Create(LauncherHandle);
        Bitmap bmpRefPic = new Bitmap("launchbutton.png");
        ImageData refpic = new ImageData(bmpRefPic);
        ImageData source = new ImageData(CapturedScreen);

        List<Rectangle> found = new List<Rectangle>();

        found = Template.AllImages(source, refpic, 124);

        Mouse.MoveRelativeToWindow(LauncherHandle, found[0].X + 50, found[0].Y + 50, true, 100);

        Mouse.LeftClick();

这不起作用。但是,如果我事先在自己的应用程序上执行SetForegroundWindow,则Mouse.Move命令可以正常工作。单击在我的应用程序边界之外的任何方式都不起作用。

2 个答案:

答案 0 :(得分:2)

SendInput将消息放入前台窗口的消息队列中。因此,如果您的应用程序是前台窗口,则SendInput会将消息放入应用程序的消息队列中。

要伪造其他应用程序中的输入,您需要:

  1. 使前景窗口成为另一个应用程序中的窗口。
  2. 使用PostMessage将输入消息直接发布到目标窗口。
  3. 选项2并不总是按预期工作,因为输入消息可能具有相当复杂的处理方式。对于鼠标消息,这不是关键消息的问题。

    使用自动化API可能更简单。

答案 1 :(得分:0)

我不确定这是否是同一个问题,但这是我想做的以及如何解决它:

How can I simulate mouse events from code?回答我发现SendInput仅适用于比您的应用程序少或相同integrity level的程序。

我想自动登录游戏。对于某些HackShield或某些东西,该游戏需要作为管理员启动。我想知道为什么我的SendInput在Firefox上工作(测试键盘事件),但不在那个游戏上。

当我关注我的应用程序时,选择了屏幕右侧区域,鼠标移动到该位置,但游戏没有获得焦点。 如果我手动聚焦游戏,应用程序会计算出正确的区域以进​​行单击,但不会执行鼠标移动和点击。

以管理员身份启动我的应用程序,解决了问题,一切都像魅力一样工作=)

希望这也可以帮助其他人!