在C#中模拟在非活动窗口的特定位置进行鼠标点击

6

以下是原问题,但是它与Java有关:

在Java中模拟在非活动窗口上的某个位置进行鼠标点击?

总之,我正在构建一个后台运行的机器人。这个机器人要求我点击。当然,我希望在机器人运行时能够做其他事情。

所以我想知道是否可以在非活动窗口上的某个位置模拟鼠标点击。

如果可能的话,我会非常感激如果你们中的任何人能够帮助我。

谢谢!


理想情况下,您应该使用SendInput,但这需要输入焦点。否则,您将不得不尝试使用PostMessage。为什么不使用UIAutomation而不是伪造输入? - David Heffernan
这个答案只是一个想法... @DavidHeffernan 你可以考虑记住鼠标位置的全局坐标,并在操作后恢复它,以及焦点。好吧,你会失去焦点,但只有一毫秒。 但是这种方法可能会改变全屏视图的状态,比如游戏之类的。我认为一个好的选择是做一个带有属性“始终置顶”的小窗口,然后在那里进行操作。如果是用于网页,例如,你可以自动滚动网页浏览器,然后点击你想要的东西。 - Leandro Bardelli
1个回答

4
是的,这是可能的。以下是我用于以前学校项目的代码:
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

public const int MOUSEEVENTF_LEFTDOWN = 0x02;
public const int MOUSEEVENTF_LEFTUP = 0x04;
public const int MOUSEEVENTF_RIGHTDOWN = 0x08;
public const int MOUSEEVENTF_RIGHTUP = 0x10;

//This simulates a left mouse click
public static void LeftMouseClick(Point position)
{
    Cursor.Position = position;
    mouse_event(MOUSEEVENTF_LEFTDOWN, position.X, position.Y, 0, 0);
    mouse_event(MOUSEEVENTF_LEFTUP, position.X, position.Y, 0, 0);
}

编辑:看起来mouse_event函数已被SendInput()替换,但它们仍然有效(适用于Windows 7及更早版本)。


1
需要目标窗口具有输入焦点。 - David Heffernan
2
mouse_event非常好,它相当于SendInput但更容易驱动。 - David Heffernan
@DavidHeffernan 对不起,我误读了他的问题,但是没有活动状态下点击是否可能?此外,您是否知道为什么要替换此函数?我在MSDN页面上没有找到具体信息。 - Nasreddine
3
SendInput 是一个更为通用和灵活的函数, mouse_eventkeybd_event 保留是为了与旧软件兼容。我认为没有理由停止使用 mouse_event。你可以向非活动窗口发送Windows消息,并有时成功地伪造输入。然而,在伪造输入之前,我建议先尝试使用 UI 自动化工具。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接