微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 将鼠标单击发送到另一个应用程序的X Y坐标

我正在尝试将模拟鼠标单击发送到另一个应用程序.我了解如何实际发送密钥点击,这不是问题.我需要将鼠标单击发送到另一个应用程序的正中心.我可以简单地测试一次并找出坐标并将点击发送到该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,UIntPtr.Zero);
    mouse_event(MouseEventFlag.LeftUp,UIntPtr.Zero);
    SetCursorPos(old_x,old_y);
}

解决方法

您可以使用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);
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐