编程方式鼠标在另一个窗口中单击

是否可以通过编程方式在另一个窗口中单击某个位置,而无需将鼠标移动到该位置,即使窗口不在顶部? 我想发送一种消息到另一个窗口模拟鼠标点击一个位置。

我试图用PostMessage完成这个工作:

PostMessage(WindowHandle, 0x201, IntPtr.Zero, CreateLParam(300,300)); PostMessage(WindowHandle, 0x202, IntPtr.Zero, CreateLParam(300,300)); 

我这样做了CreateLParam函数:

 private static IntPtr CreateLParam(int LoWord, int HiWord) { return (IntPtr)((HiWord << 16) | (LoWord & 0xffff)); } 

问题是窗口被locking在他的位置上。 我认为我的应用程序点击(1,1)坐标。 可以帮助我解决这个问题吗?

编辑:这是PostMessage:

 [return: MarshalAs(UnmanagedType.Bool)] [DllImport("user32.dll")] public static extern bool PostMessage(IntPtr WindowHandle, int Msg, IntPtr wParam, IntPtr lParam); 

而0x201和0x202分别是WM_LBUTTONDOWN和WM_LBUTTONUP。

你不能通过发送消息来做到这一点,而是使用SendInput Windows API。

调用方法ClickOnPoint,这是一个从窗体点击事件的例子,所以this.handle是窗体句柄,注意这些窗口上的客户端坐标处理发送,你可以很容易地改变这一点,并发送屏幕坐标,在这种情况下,你不下面不需要处理或ClientToScreen调用。

 ClickOnPoint(this.Handle, new Point(375, 340)); 

更新:现在使用SendInput,汤姆汤姆。

顺便说一句。 我只使用这个示例需要的声明,为了更多有一个很好的库: Windowsinput模拟器(C#SendInput包装 – 模拟键盘和鼠标)

  public class ClickOnPointTool { [DllImport("user32.dll")] static extern bool ClientToScreen(IntPtr hWnd, ref Point lpPoint); [DllImport("user32.dll")] internal static extern uint SendInput(uint nInputs, [MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs, int cbSize); #pragma warning disable 649 internal struct INPUT { public UInt32 Type; public MOUSEKEYBDHARDWAREINPUT Data; } [StructLayout(LayoutKind.Explicit)] internal struct MOUSEKEYBDHARDWAREINPUT { [FieldOffset(0)] public MOUSEINPUT Mouse; } internal struct MOUSEINPUT { public Int32 X; public Int32 Y; public UInt32 MouseData; public UInt32 Flags; public UInt32 Time; public IntPtr ExtraInfo; } #pragma warning restore 649 public static void ClickOnPoint(IntPtr wndHandle , Point clientPoint) { var oldPos = Cursor.Position; /// get screen coordinates ClientToScreen(wndHandle, ref clientPoint); /// set cursor on coords, and press mouse Cursor.Position = new Point(clientPoint.X, clientPoint.Y); var inputMouseDown = new INPUT(); inputMouseDown.Type = 0; /// input type mouse inputMouseDown.Data.Mouse.Flags = 0x0002; /// left button down var inputMouseUp = new INPUT(); inputMouseUp.Type = 0; /// input type mouse inputMouseUp.Data.Mouse.Flags = 0x0004; /// left button up var inputs = new INPUT[] { inputMouseDown, inputMouseUp }; SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(INPUT))); /// return mouse Cursor.Position = oldPos; } } 

我发现在过去,发送消息到Windows Media Player的一种方式,所以我用它来模拟点击我想要的应用程序!

使用这个类 (下面的代码)来find窗口并发送你想要的消息!

 using System; using System.Runtime.InteropServices; namespace Mouse_Click_Simulator { /// <summary> /// Summary description for Win32. /// </summary> public class Win32 { // The WM_COMMAND message is sent when the user selects a command item from // a menu, when a control sends a notification message to its parent window, // or when an accelerator keystroke is translated. public const int WM_KEYDOWN = 0x100; public const int WM_KEYUP = 0x101; public const int WM_COMMAND = 0x111; public const int WM_LBUTTONDOWN = 0x201; public const int WM_LBUTTONUP = 0x202; public const int WM_LBUTTONDBLCLK = 0x203; public const int WM_RBUTTONDOWN = 0x204; public const int WM_RBUTTONUP = 0x205; public const int WM_RBUTTONDBLCLK = 0x206; // The FindWindow function retrieves a handle to the top-level window whose // class name and window name match the specified strings. // This function does not search child windows. // This function does not perform a case-sensitive search. [DllImport("User32.dll")] public static extern int FindWindow(string strClassName, string strWindowName); // The FindWindowEx function retrieves a handle to a window whose class name // and window name match the specified strings. // The function searches child windows, beginning with the one following the // specified child window. // This function does not perform a case-sensitive search. [DllImport("User32.dll")] public static extern int FindWindowEx( int hwndParent, int hwndChildAfter, string strClassName, string strWindowName); // The SendMessage function sends the specified message to a window or windows. // It calls the window procedure for the specified window and does not return // until the window procedure has processed the message. [DllImport("User32.dll")] public static extern Int32 SendMessage( int hWnd, // handle to destination window int Msg, // message int wParam, // first message parameter [MarshalAs(UnmanagedType.LPStr)] string lParam); // second message parameter [DllImport("User32.dll")] public static extern Int32 SendMessage( int hWnd, // handle to destination window int Msg, // message int wParam, // first message parameter int lParam); // second message parameter } } 

例如:

  Win32.SendMessage(iHandle, Win32.WM_LBUTTONDOWN, 0x00000001, 0x1E5025B); 

这里是我创build的应用程序源代码 ,在特定的时间间隔内自动点击“BlueStacks”应用程序!

对于FindWindowwParamlParam等,你可以随意问我该怎么做! 这不是太难:);希望它有帮助! 🙂