Перетащить мышью

Я создал следующий код, который наведет курсор мыши на кликабельную точку элемента автоматизации и затем наведет курсор мыши на кликабельную точку другого элемента. Это должно иметь эффект перетаскивания, но это не так. Он ведет себя странным образом. Кажется, просто выбрать элементы вместо перетаскивания.

public static void Main(String[] args)
        {
             contactsGrid.getCell("Cell Data").drag();
             navTree.getNode("Tree Data").drop();
        }

public void drag()
        {
            element.SetFocus();
            ScreenClick.leftDown(element);
        }

public void drop()
        {
            element.SetFocus();
            ScreenClick.leftUp(element);
        }

public static void leftDown(AutomationElement element)
        {
            while (!element.Current.IsKeyboardFocusable)
                element = TreeWalker.RawViewWalker.GetFirstChild(element);

            Point p;
            element.TryGetClickablePoint(out p);

            leftDown((int)p.X, (int)p.Y);
        }

public static void leftUp(AutomationElement element)
        {
            while (!element.Current.IsKeyboardFocusable)
                element = TreeWalker.RawViewWalker.GetFirstChild(element);

            Point p;
            element.TryGetClickablePoint(out p);

            leftUp((int)p.X, (int)p.Y);

        }

public static void leftDown(int x, int y)
        {
            Cursor.Position = new System.Drawing.Point(x, y);
            mouse_event((int)(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0);
        }

public static void leftUp(int x, int y)
        {
            Cursor.Position = new System.Drawing.Point(x, y);
            mouse_event((int)(MouseEventFlags.LEFTUP), 0, 0, 0, 0);
        }

1 ответ

Попробуйте использовать mouse_event (MOUSEEVENTF_MOVE|..._ABSOLUTE), чтобы выполнить перемещение вместо Cursor.Position.

(Обратите внимание, что необходимые для этого координаты отличаются от координат простого экрана, поэтому вам придется выполнить некоторое отображение / масштабирование, обрабатывая весь экран как пространство от 0,0 до 65535 65535 - подробнее в разделе "Примечания" для mouse_event.)

Обычно приложения реализуют перетаскивание, ожидая WM_LBUTTONDOWN, и обычно ожидают также и некоторые сообщения WM_MOUSEMOVE, в противном случае они просто будут считать простой ВВЕРХ / ВНИЗ нажатием, а не перетаскиванием. Я предполагаю, что с помощью Cursor.Position (который по сути является оберткой для SetCursorPos), вы "меняете положение курсора, не перемещая его" - входные сообщения не генерируются, поэтому базовое приложение никогда не получает сообщений WM_MOUSEMOVE и никогда не понимает, что он должен делать перетаскивание.

Другие вопросы по тегам