AWT机器人不能拖动窗口

我正在尝试使用AWT Robot移动Windows资源pipe理器窗口。 机器人运行在Java 7中,操作系统是Windows 7。

我能够移动鼠标并点击事物,但是当我尝试点击并拖动时,似乎没有按下button。 我看不出有什么问题,或者想想如何弄清楚发生了什么。

我开始使用Sikuli:

mouse.mouseDown(InputEvent.BUTTON1_MASK); mouse.drop(targetLocation); 

如果这样做不起作用,我直接尝试了一个较低级别的实现:

 Robot robot = new Robot(); robot.mousePress(InputEvent.BUTTON1_MASK); robot.mouseMove(targetLocation.getX(), targetLocation.getY()); robot.mouseRelease(InputEvent.BUTTON1_MASK); 

鼠标在正确的位置开始移动到正确的目的地,但似乎没有按下button。

Solutions Collecting From Web of "AWT机器人不能拖动窗口"

在sikuli使用mouse.drag()然后mouse.drop()。 例:

 ScreenRegion fullScreenRegion=new ScreenRegion(); ImageTarget dragImageTarget=new ImageTarget("dragTargetFile"); ScreenRegion dragTargetRegion=fullScreenRegion.find(dragImageTarget); ImageTarget dropImageTarget=new ImageTarget("dropTargetFile"); ScreenRegion dropTargetRegion=fullScreenRegion.find(dropImageTarget); Mouse mouse = new DesktopMouse(); mouse.drag(dragTargetRegion.getCenter()); mouse.drop(dropTargetRegion.getCenter()); 

对于Java机器人API:您应该按顺序调用mouseMove(),mousePress(),mouseMove(),然后调用mouseRelease()。 例:

 Robot robot=new Robot(); // drag robot.mouseMove(x1, y1); robot.mousePress(InputEvent.BUTTON1_MASK); // drop robot.mouseMove(x2, y2); robot.mouseRelease(InputEvent.BUTTON1_MASK); 

我有一个类似的问题。 尝试添加Thread.sleep(100); (或超过100)在每个机器人操作之间。

为什么它不适合你Sikuli? 什么是问题? 我自己尝试过,而且工作。 我的环境:Win7的禁用窗口透明度,Sikuli r930。 为了简化测试,在开始测试之前已经打开了一些窗口。 这是我的工作示例:

 winExpl_topRightCornerImg = Pattern("1368690528515.png").targetOffset(-2,-13) """winExpl_topRightCornerImg is a part of a window containing top bar. I captured huge rectangle containing navigation arrows and I changed target offset, so that Sikuli clicks only on a bar""" anyRectangleAtDesktop = "1368690615156.png" #any particular part of a desktop drag(winExpl_topRightCornerImg) dropAt(anyRectangleAtDesktop) 

我有完全相同的问题。 甚至尝试了@Andrzej Kasp说,加上线程睡眠一定的时间。 这是行不通的,直到我根据@Andrzej Kasp的评论做了一些修改。 感谢Andrzej Kasp。

它不工作的全部原因是因为线程被串行执行。 我试图添加thread.sleep(100); 每个动作之间都不起作用。 代码如下:

 robot.mouseMove(x1,y1); //step 1 thread.sleep(100); robot.mousePress(InputEvent.BUTTON1_MASK); //step 2 thread.sleep(100); robot.mouseMove(x2, y2); //step 3 thread.sleep(100); robot.mouseRelease(InputEvent.BUTTON1_MASK); //step 4 

这对我不起作用。 它可能会为你工作。 取决于电脑。 整个背后的理论是,如果你想确保工作,你必须确保在光标移动的同时按下鼠标。 即。 步骤2和步骤3正在同时执行。 在正常情况下,除非使用thread.sleep(),否则计算机在运行此程序时不会创建新线程,它将挂起当前线程,并将处理器时间分配给其他线程。 所以你不必在每一步之后添加thread.sleep(100),而只需要在步骤2和步骤3之间添加thread.sleep(100)。我已经测试了这些代码,并且它们工作正常。 代码如下:

 robot.mouseMove(x1,y1); //step 1 robot.mousePress(InputEvent.BUTTON1_MASK); //step 2 thread.sleep(100); robot.mouseMove(x2, y2); //step 3 robot.mouseRelease(InputEvent.BUTTON1_MASK); //step 4 

让我知道你是否有更多的问题。