2012-05-24 78 views
0

我创建了下面的代码,它将鼠标放在自动化元素的可点击的点上,然后在另一个元素的可点击的点上鼠标移动。这应该具有拖放的效果,但它不会那样做。它表现得很奇怪。它似乎只是选择项目,而不是拖动。drag and drop uiautomation

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

回答

0

尝试使用mouse_event(MOUSEEVENTF_MOVE | ..._ ABSOLUTE)来执行移动而不是Cursor.Position。

(请注意,它需要的坐标为普通屏幕坐标不同,所以你必须做一些映射/缩放,处理整个屏幕为0,0至65535,65535空间 - more details in the Remarks section for mouse_event

通常,应用程序通过等待WM_LBUTTONDOWN来实现拖动,并且通常还需要一些WM_MOUSEMOVE消息,否则他们只会将普通的UP/DOWN视为点击而不是拖动。我的猜测是通过使用Cursor.Position(这基本上是SetCursorPos的包装),你“改变光标的位置而不移动它” - 没有生成输入消息,所以底层应用程序永远不会得到任何WM_MOUSEMOVE消息,从来没有意识到它应该做一个拖动。