Robot.mouseMove没有正确移动到指定的位置

时间:2018-02-15 03:03:46

标签: java windows mousemove awtrobot

每当我为机器人运行mouseMove命令时,鼠标都不会始终到达同一位置。例如,我有以下代码:

import java.awt.Robot;
import java.util.concurrent.TimeUnit;

public class MainBot {
    public static void main(String[] args){
        try {
            Robot screenWin = new Robot();
            TimeUnit.SECONDS.sleep(2);
            screenWin.mouseMove(100, 300);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

代码通常使鼠标在X:

结束

Mouse Location after running 首先,我点击运行(我正在使用eclipse)并将鼠标移动到某个位置(在2秒计时器启动之前)。然后2秒延迟结束,鼠标移动,然后脚本结束。问题是,鼠标似乎永远不会两次到同一个地方。例如,鼠标应转到(100, 300),但大多数情况下它会变为(0, 300)。但是,其他时候,如果我将鼠标从头开始移动到它应该大致的位置,那么它就会到达正确的位置。

我正在使用Paint来获取屏幕截图的像素位置,但我不认为这是因为位置不断变化。

我是否遗漏了mouseMove的坐标是如何工作的?

编辑:基本上,我点击该程序开始,然后将鼠标移动到新位置(因此在mouseMove函数之前有一个不同的初始位置)然后{ {1}}执行。每次我这样做,鼠标都会转到不同的位置。

5 个答案:

答案 0 :(得分:2)

我找到了一个解决方案,只需将鼠标移至坐标(0,0),然后将其移至所需位置即可。

答案 1 :(得分:1)

我写了一个类来做正确的光标定位。 这也适用于Windows 10 scalings。

使用MoveMouseControlled(double,double)函数将光标移动到指定位置。它使用[0,1]坐标系。 (0,0)点是屏幕的左上角。

import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.Robot;
import java.awt.Toolkit;

public class MouseCorrectRobot extends Robot
{
    final Dimension ScreenSize;// Primary Screen Size

    public MouseCorrectRobot() throws AWTException
    {
        super();
        ScreenSize = Toolkit.getDefaultToolkit().getScreenSize();
    }

    private static double getTav(Point a, Point b)
    {
        return Math.sqrt((double) ((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)));
    }

    public void MoveMouseControlled(double xbe, double ybe)// Position of the cursor in [0,1] ranges. (0,0) is the upper left corner
    {

        int xbepix = (int) (ScreenSize.width * xbe);
        int ybepix = (int) (ScreenSize.height * ybe);

        int x = xbepix;
        int y = ybepix;

        Point mert = MouseInfo.getPointerInfo().getLocation();
        Point ElozoInitPont = new Point(0, 0);

        int UgyanAztMeri = 0;
        final int UgyanAZtMeriLimit = 30;

        int i = 0;
        final int LepesLimit = 20000;
        while ((mert.x != xbepix || mert.y != ybepix) && i < LepesLimit && UgyanAztMeri < UgyanAZtMeriLimit)
        {
            ++i;
            if (mert.x < xbepix)
                ++x;
            else
                --x;
            if (mert.y < ybepix)
                ++y;
            else
                --y;
            mouseMove(x, y);

            mert = MouseInfo.getPointerInfo().getLocation();

            if (getTav(ElozoInitPont, mert) < 5)
                ++UgyanAztMeri;
            else
            {
                UgyanAztMeri = 0;
                ElozoInitPont.x = mert.x;
                ElozoInitPont.y = mert.y;
            }

        }
    }

}

答案 2 :(得分:0)

OpenJDK上存在一个漏洞,所以这可能是相关的:

https://bugs.openjdk.java.net/browse/JDK-8196030?jql=project%20in%20(JDK)%20AND%20component%20in%20(client-libs)%20AND%20Subcomponent%20in%20(java.awt)

该错误详细说明了Windows 10 Fall Creators更新中可能引入的一个问题,与屏幕缩放和mouse_move功能有关。

与此同时,您可以尝试将屏幕比例设置为100%而不是125%,看看是否有帮助。

答案 3 :(得分:0)

我只是遇到了类似的问题,为解决这个问题,我做了一个循环:

  • 测试位置
  • 移动
  • 测试位置
  • 如果不能,请再次移动

它总是少于2个循环

Point pd = new Point(X,Y); // X,Y where mouse must go
int n = 0;
while ((!pd.equals(MouseInfo.getPointerInfo().getLocation())) && (++n <= 5))
{
    r.mouseMove(pd.x, pd.y);
}

答案 4 :(得分:0)

全屏模式下使用 zoom = 100%,效果很好(正确的位置)。按chrome中的F-11进入全屏页面。