C# 在C语言中,在非活动窗口的某个位置模拟鼠标单击#
这是最初的问题,但java认为: 不管怎样,我正在构建一个在后台运行的机器人。这个机器人需要我点击。当然,我希望能够在机器人运行时做其他事情 所以我想知道是否有可能在非活动窗口的某个位置模拟鼠标点击 如果这是可能的,如果你们中的任何人能帮助我,我将不胜感激C# 在C语言中,在非活动窗口的某个位置模拟鼠标单击#,c#,visual-studio-2010,C#,Visual Studio 2010,这是最初的问题,但java认为: 不管怎样,我正在构建一个在后台运行的机器人。这个机器人需要我点击。当然,我希望能够在机器人运行时做其他事情 所以我想知道是否有可能在非活动窗口的某个位置模拟鼠标点击 如果这是可能的,如果你们中的任何人能帮助我,我将不胜感激 谢谢 是的,这是可能的,以下是我以前在学校项目中使用的代码: [System.Runtime.InteropServices.DllImport("user32.dll")] public static extern void mouse_
谢谢 是的,这是可能的,以下是我以前在学校项目中使用的代码:
[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);
}
编辑:该函数似乎已被替换,但仍然有效(Windows 7及更早版本)理想情况下,您应该使用
SendInput
,但这需要输入焦点。否则,您将不得不用PostMessage
试试运气。为什么不使用UIAutomation而不是伪造输入?这个答案只是一个想法@DavidHeffernan你可以记住鼠标位置的全局坐标,并在动作后恢复它,也可以恢复焦点。好的,你会失去焦点,但会持续一毫秒。但是这个方法可以改变全屏视图的状态,比如游戏或者类似的东西。我认为这是一个很好的选择做一个小窗口,属性“始终在顶部”,然后在那里做。例如,如果是针对web,您可以使用web浏览器自动滚动它,然后单击所需内容。这要求目标窗口具有输入焦点。鼠标事件
非常好,它相当于发送输入
,但更容易驾驶。@DavidHeffernan很抱歉我误读了他的问题,但是,这甚至可以在不处于活动状态的情况下单击吗?另外,您是否知道为什么要替换此功能?我在MSDN页面上没有找到具体信息。SendInput
是一个更通用的灵活功能<保留代码>鼠标事件和keybd\u事件
,以便与旧软件兼容。我认为没有理由停止使用鼠标事件
。您可以将Windows消息发布到非活动的Windows,有时还可以成功伪造输入。然而,在伪造输入之前,我会先查看UIautomation。