AWT机器人无法拖动窗口

时间:2013-05-09 16:21:38

标签: java windows awtrobot sikuli

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

我可以移动鼠标并单击某些东西,但是当我尝试单击并拖动时,它似乎根本没有按下按钮。我看不出有什么问题,或者想想如何弄清楚发生了什么。

我开始使用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);

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

4 个答案:

答案 0 :(得分:3)

在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 Robot 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);

答案 1 :(得分:1)

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

答案 2 :(得分:0)

为什么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)

答案 3 :(得分:0)

我有完全相同的问题。甚至尝试了@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

如果您有更多问题,请与我们联系。