首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AWT Robot无法拖动窗口

AWT Robot无法拖动窗口
EN

Stack Overflow用户
提问于 2013-05-10 00:21:38
回答 4查看 3.7K关注 0票数 4

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

我可以移动鼠标并点击东西,但当我尝试点击并拖动时,它似乎根本没有按下按钮。我看不到哪里出了问题,也不知道怎么弄清楚到底是怎么回事。

我一开始使用的是Sikuli:

代码语言:javascript
运行
复制
mouse.mouseDown(InputEvent.BUTTON1_MASK);
mouse.drop(targetLocation);

当这不起作用时,我尝试了一个较低级别的实现,直接与机器人合作:

代码语言:javascript
运行
复制
Robot robot = new Robot();
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.mouseMove(targetLocation.getX(), targetLocation.getY());
robot.mouseRelease(InputEvent.BUTTON1_MASK);

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

EN

回答 4

Stack Overflow用户

发布于 2013-06-12 02:27:44

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

代码语言:javascript
运行
复制
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()。示例:

代码语言:javascript
运行
复制
Robot robot=new Robot();
// drag
robot.mouseMove(x1, y1);
robot.mousePress(InputEvent.BUTTON1_MASK);
// drop
robot.mouseMove(x2, y2);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
票数 4
EN

Stack Overflow用户

发布于 2017-07-13 00:28:07

我也遇到了完全相同的问题。甚至尝试了@Andrzej Kasp所说的,在一定的时间内添加线程睡眠。它不起作用,直到我根据@Andrzej Kasp的评论做了一些修改。感谢Andrzej Kasp。

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

代码语言:javascript
运行
复制
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)。我测试了这些代码,它们工作正常。代码如下:

代码语言:javascript
运行
复制
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

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

票数 2
EN

Stack Overflow用户

发布于 2013-07-04 16:38:18

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16466461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档