Вопрос по c# – Отправлять щелчки мыши по координате X Y другого приложения

4

Я пытаюсь отправить смоделированный щелчок мыши в другое приложение. Я понимаю, как на самом деле отправить нажатие клавиши, это не проблема. Мне нужно отправить щелчок мыши в самый центр другого приложения. Я могу просто проверить его один раз, узнать координату и отправить щелчок в это место 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 #" & quot; и тому подобное. Вот для чего нужны теги. John Saunders
Заголовок вводит в заблуждение (особенно для Google), ваша проблема в том, как найти положение и размер окна, а не в том, как отправить щелчок мышью куда-нибудь. Emperor Orionii

Ваш Ответ

2   ответа
0

Установите позицию курсора И также установите 0,0 как X и Y в подпрограмме mouse_event:

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

Работает нормально для меня сейчас.

1

Вы можете использовать API GetWindowInfo:

    [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);
    }
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededGetWindowRectError: User Rate Limit ExceededGetClientRectError: User Rate Limit ExceededcbSizeError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы