Перемещение курсора мыши программно - PullRequest
21 голосов
/ 15 марта 2009

Для начала я нашел этот код на http://swigartconsulting.blogs.com/tech_blender/2005/08/how_to_move_the.html:

public class Win32
{
    [DllImport("User32.Dll")]
    public static extern long SetCursorPos(int x, int y);

    [DllImport("User32.Dll")]
    public static extern bool ClientToScreen(IntPtr hWnd, ref POINT point);

    [StructLayout(LayoutKind.Sequential)]
    public struct POINT
    {
        public int x;
        public int y;
    }
}

Вставьте следующий код в обработчик событий нажатия кнопки:

Win32.POINT p = new Win32.POINT();
p.x = button1.Left + (button1.Width / 2);
p.y = button1.Top + (button1.Height / 2);

Win32.ClientToScreen(this.Handle, ref p);
Win32.SetCursorPos(p.x, p.y);

Это переместит указатель мыши в центр кнопки.

Этот код прекрасно работает, но я не могу понять, как его немного расширить. Допустим, у меня есть Internet Explorer (встроенный в форму Windows), открытый для веб-страницы (какой-то случайной страницы, о которой я раньше не знал) с раскрывающимся списком. Я изменил приведенный выше код, чтобы переместить курсор и получить раскрывающееся поле со списком (используя метод щелчка мышью, показанный ниже, чтобы раскрыть список), а также перемещать вверх и вниз по списку, выделяя каждый элемент как указатель мыши проходит, но я не могу понять, как на самом деле сделать щелчок мышью на выбранном в данный момент элементе, чтобы сохранить выбор. То, как я делаю это сейчас, выпадающий список просто закрывается, и выбор не изменяется. Я использую следующий код для щелчка мышью (который приводит к раскрытию списка):

private static void MouseClick(int x, int y, IntPtr handle) //handle for the browser window
{
    IntPtr lParam = (IntPtr)((y << 16) | x); // The coordinates
    IntPtr wParam = IntPtr.Zero; // Additional parameters for the click (e.g. Ctrl)

    const uint downCode = 0x201; // Left click down code
    const uint upCode = 0x202; // Left click up code

    SendMessage(handle, downCode, wParam, lParam); // Mouse button down
    SendMessage(handle, upCode, wParam, lParam); // Mouse button up
}

Я уверен, что мне здесь не хватает чего-то простого, но я не могу понять, что это такое. Спасибо всем заранее.

Bob

Ответы [ 2 ]

16 голосов
/ 15 марта 2009

Вы должны использовать SendInput (http://msdn.microsoft.com/en-us/library/ms646310(VS.85).aspx), чтобы синтезировать события щелчка мышью вместо непосредственного использования SendMessages.

3 голосов
/ 15 марта 2009

Я считаю, что вам не хватает правильного WPARAM для сообщения WM_LBUTTONDOWN, которое для левой кнопки - MK_LBUTTON

 #define MK_LBUTTON          0x0001
...