4

我正在尝试使用 AWT 机器人移动 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

4 回答 4

4

在 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);
于 2013-06-11T18:27:43.860 回答
2

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

它对我不起作用。不过它可能对你有用。取决于电脑。这背后的整个理论是,如果你想确定是否工作,你必须确保在光标移动时按下鼠标。IE。步骤 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

如果您有更多问题,请告诉我。

于 2017-07-12T16:28:07.440 回答
1

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

于 2013-07-04T08:38:18.347 回答
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)
于 2013-05-16T08:04:07.433 回答