2013-05-09 105 views
2

我想使用AWT机器人移动Windows资源管理器窗口。机器人运行在Java 7中,操作系统是Windows 7.AWT机器人无法拖动窗口

我可以移动鼠标并单击事物,但是当我尝试单击并拖动时,它似乎不是完全按下按钮。我看不出有什么不对,或者想想如何弄清楚发生了什么。

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

在鼠标开始正确的地方,并移动到正确的目的地,但似乎没有按下按钮。

回答

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) 
+0

我正在使用Sikuli-API,Java库,而不是使用Jython包装器/库的Sikuli。这个问题,正如我在我的问题中所说的那样:“鼠标在正确的位置开始移动到正确的目的地,但似乎没有按下按钮。” – 2013-05-16 16:06:30

+0

@ Nathaniel Waisbrot:我明白了。我们在不同的Sikuli环境中工作,这就是为什么行为也不同。 – 2013-05-16 18:55:06

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机器人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

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

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 

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