加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 21:34:53 所属栏目:百科 来源:网络整理
导读:我正在尝试将模拟鼠标单击发送到另一个应用程序.我了解如何实际发送密钥点击,这不是问题.我需要将鼠标单击发送到另一个应用程序的正中心.我可以简单地测试一次并找出坐标并将点击发送到该XY位置,但是有一个问题……当我移动窗口或调整此窗口大小时,XY坐标显
我正在尝试将模拟鼠标单击发送到另一个应用程序.我了解如何实际发送密钥点击,这不是问题.我需要将鼠标单击发送到另一个应用程序的正中心.我可以简单地测试一次并找出坐标并将点击发送到该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);
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读