将鼠标点击发送到另一个应用程序的 X Y 坐标

Posted

技术标签:

【中文标题】将鼠标点击发送到另一个应用程序的 X Y 坐标【英文标题】:Send mouse clicks to X Y coordinate of another application 【发布时间】:2012-05-31 14:22:08 【问题描述】:

我正在尝试将模拟鼠标点击发送到另一个应用程序。我了解如何实际发送按键,这不是问题。我需要将鼠标点击发送到另一个应用程序的中心。我可以简单地测试一次并找出坐标并将点击发送到那个XY位置,但是有一个问题......当我移动窗口或调整这个窗口的大小时,XY坐标显然会不一样。

所以我需要找出如何获取窗口的大小及其位置,然后从中找到中心点。有人知道怎么做吗?非常感谢您的任何回复!

这是我发送鼠标点击的代码

public void SendLeftClick(int x, int y)

    int old_x, old_y;
    old_x = Cursor.Position.X;
    old_y = Cursor.Position.Y;

    SetCursorPos(x, y);
    mouse_event(MouseEventFlag.LeftDown, x, y, 0, UIntPtr.Zero);
    mouse_event(MouseEventFlag.LeftUp, x, y, 0, UIntPtr.Zero);
    SetCursorPos(old_x, old_y);

【问题讨论】:

请不要在标题前加上“C#”之类的前缀。这就是标签的用途。 标题具有误导性(尤其是对 Google 而言),您的问题是如何查找窗口位置和大小,而不是如何发送鼠标点击。 【参考方案1】:

您可以使用 GetWindowInfo API:

    [return: MarshalAs(UnmanagedType.Bool)]
    [DllImport("user32.dll", SetLastError = true)]
    private static extern bool GetWindowInfo(IntPtr hwnd, ref WINDOWINFO pwi);

    [StructLayout(LayoutKind.Sequential)]
    struct WINDOWINFO
    
        public uint cbSize;
        public RECT rcWindow;
        public RECT rcClient;
        public uint dwStyle;
        public uint dwExStyle;
        public uint dwWindowStatus;
        public uint cxWindowBorders;
        public uint cyWindowBorders;
        public ushort atomWindowType;
        public ushort wCreatorVersion;

        public WINDOWINFO(Boolean? filler)
            : this()   // Allows automatic initialization of "cbSize" with "new WINDOWINFO(null/true/false)".
        
            cbSize = (UInt32)(Marshal.SizeOf(typeof(WINDOWINFO)));
        

    
    [StructLayout(LayoutKind.Sequential)]
    struct RECT
    
        public int left, top, right, bottom;
    


    private void button1_Click_1(object sender, EventArgs e)
    
        var p = System.Diagnostics.Process.GetProcessesByName("mspaint");

        if (p.Length == 0) return;

        WINDOWINFO wi = new WINDOWINFO(false);
        GetWindowInfo(p[0].MainWindowHandle, ref wi);

        SendLeftClick((wi.rcWindow.left + wi.rcWindow.right) / 2, (wi.rcWindow.top + wi.rcWindow.bottom) / 2);
    

【讨论】:

似乎过于复杂,而 GetWindowRectGetClientRect 会这样做。额外的复杂性会导致错误,例如您在调用之前没有设置cbSize cbsize 在 windowinfo 调用的构造函数中设置。如果他在计算时需要考虑窗口的边界,这个调用也会有所帮助,但你的观点是有效的。 在你没用过的单参数构造函数中?【参考方案2】:

在 mouse_event 例程中设置光标位置并同时将 0,0 设置为 X 和 Y:

SetCursorPos(x, y);
mouse_event(MouseEventFlag.LeftDown, 0, 0, 0, UIntPtr.Zero);
mouse_event(MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);

现在对我来说工作得很好。

【讨论】:

以上是关于将鼠标点击发送到另一个应用程序的 X Y 坐标的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 将鼠标单击发送到任务栏中的按钮

将数据从通知点击发送到子活动

将 Angular 中的点击发送到 Google Pub/Sub

如何将参数从通知点击发送到活动?

通过 Chrome 开发工具控制台将点击发送到“生成的源/计算的 html”按钮

Flex Datagrid - 如何获取鼠标 x/y 坐标的项目?