0

我创建了以下代码,它将鼠标按下自动化元素的可点击点,然后将鼠标放在另一个元素的可点击点上。这应该具有拖放的效果,但它不会那样做。它的行为方式很奇怪。似乎只是选择项目而不是拖动。

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);
        }
4

1 回答 1

0

尝试使用 mouse_event (MOUSEEVENTF_MOVE|..._ABSOLUTE) 代替 Cursor.Position 进行移动。

(请注意,它所采用的坐标与普通屏幕坐标不同,因此您必须进行一些映射/缩放,将整个屏幕视为 0,0 到 65535,65535 的空间 -更多详细信息,请参见 mouse_event 的备注部分。 )

通常,应用程序通过等待 WM_LBUTTONDOWN 来实现拖动,并且通常还期望一些 WM_MOUSEMOVE 消息,否则它们只会将普通的 UP/DOWN 视为单击,而不是拖动。我的猜测是,通过使用 Cursor.Position(它基本上是 SetCursorPos 的包装器),您“在不移动光标的情况下更改光标的位置” - 不会生成输入消息,因此底层应用程序永远不会收到任何 WM_MOUSEMOVE 消息并且从来没有意识到它应该在做拖累。

于 2012-06-11T07:05:00.757 回答