【问题标题】:AWT Robot not able to drag a windowAWT 机器人无法拖动窗口
【发布时间】:2013-05-04 04:55:59
【问题描述】:

我正在尝试使用 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);

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

【问题讨论】:

    标签: java windows awtrobot sikuli


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我遇到了完全相同的问题。甚至尝试过@Andrzej Kasp 所说的,在一定时间内添加线程睡眠。它不起作用,直到我根据@Andrzej Kasp `s cmets 进行了一些修改。感谢 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
      

      如果您还有其他问题,请告诉我。

      【讨论】:

      • 我发现它依赖于小调整;例如,我从你的最后四个步骤开始,但为了让它被识别为 dnd 手势,我必须添加一个额外的微小中间动作。尽管如此,到目前为止,在mouseRelease 之后,我还没有成功完成 DnD。 (在我的例子中,DnD 是 GUI 中的一个对象,而不是一个窗口)
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 我使用的是 Java 库 Sikuli-API,而不是 Jython 包装器/库 Sikuli。正如我在问题中所说,问题是“鼠标从正确的位置开始并移动到正确的目的地,但似乎没有按下按钮。”
        • @Nathaniel Waisbrot:我明白了。我们在不同的 Sikuli 环境中工作,因此行为也不同。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-09
        • 1970-01-01
        • 1970-01-01
        • 2014-09-22
        • 2015-03-16
        相关资源
        最近更新 更多