【问题标题】:Simulate mouse clicks at a certain position on inactive window in C#在C#中模拟非活动窗口上某个位置的鼠标点击
【发布时间】:2011-11-23 12:45:07
【问题描述】:

这是原始问题,但它被认为是java: Simulate mouse clicks at a certain position on inactive window in Java?

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

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

如果可以的话,如果有人能帮助我,我将不胜感激。

谢谢!

【问题讨论】:

  • 理想情况下您应该使用SendInput,但这需要输入焦点。否则,您将不得不使用PostMessage 试试运气。为什么不使用 UIAutomation 而不是伪造输入?
  • 这个答案只是一个想法......@DavidHeffernan你可以记住鼠标位置的全局坐标并在动作后恢复它,还有焦点。好的,你会失去焦点,但它会持续一毫秒。但是这种方法可以改变全屏视图的状态,比如游戏或类似的东西。我认为这是一个不错的选择,做一个带有“始终在顶部”的属性的小窗口,然后在那里做。例如,如果它是用于网络的,您可以使用网络浏览器自动滚动它,然后单击所需的内容。

标签: c# visual-studio-2010


【解决方案1】:

是的,这是可能的,这是我在以前的学校项目中使用的代码:

[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 及更早版本)

【讨论】:

  • 这要求目标窗口有输入焦点。
  • mouse_event 非常好,相当于SendInput,但更容易驾驶。
  • @DavidHeffernan 对不起,我误读了他的问题,但是即使没有激活也可以点击吗?另外,您是否知道为什么要替换此功能?我没有在 MSDN 页面上找到该特定信息。
  • SendInput 是一个更通用的灵活函数。保留mouse_eventkeybd_event 是为了与旧软件兼容。我认为没有理由停止使用mouse_event。您可以将 Windows 消息发布到非活动 Windows,并且有时会成功伪造输入。但是,在伪造输入之前,我会考虑 UIautomation。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
相关资源
最近更新 更多