机器人.mouseMove无法正确移动到指定位置

8
每当我运行机器人的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:

执行后的鼠标位置 首先,我点击运行(我使用的是eclipse),并将鼠标移动到一个位置(在2秒计时器结束之前)。然后2秒延迟结束,鼠标移动,然后脚本结束。问题是,鼠标似乎从未到达过完全相同的位置。例如,鼠标应该移动到 (100, 300),但大多数情况下它移动到类似于 (0, 300) 的某个位置。但其他时候,如果我在开始时将鼠标移动到大致应该的位置,则它会移动到正确的位置。

我正在使用 Paint 获取屏幕截图的像素位置来获取鼠标应该出现的位置,但我认为那不是问题所在,因为位置一直在变化。

是否有什么我没有注意到的关于 mouseMove 坐标如何工作的内容?

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


你描述了很多互动 - 我不知道你在做什么 - 或许有一个程序可以展示。 - gpasch
程序的唯一其他部分是它所包含的 main 函数。我增加了一点澄清。 - DarkHorse
哦,好的。我想你所说的100是从屏幕开头开始计算的,你展示的是你的工作窗口吗?如果你展示的是距离屏幕左边100像素的工作窗口,那么就是正确的;但如果你展示的是整个显示器,那我就不知道出了什么问题。 - gpasch
1
@Shiven,其他人似乎也遇到了同样的问题,而且似乎有一项反对JDK的开放门票,其描述可能也适用于您的问题。 - Matt Clark
由于这在某些系统上似乎总是有效的,请@Shiven添加有关您使用的确切JDK版本、Windows版本等的详细信息。 - Deepak
显示剩余3条评论
5个回答

7

1
为什么这个答案被踩了?这正是发生的原因。你可以在任何安装了创作者更新的Windows 10上验证这一点。 - mjuopperi

4

我找到了一个解决方法,你只需要将鼠标移动到坐标 (0,0) 的位置,然后你就可以将它移动到想要的地方。


1
我编写了一个类来进行正确的光标定位。这也适用于 Windows 10 的缩放。
使用 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;
            }

        }
    }

}

0

全屏模式下,缩放比例为100%,它可以在正确的位置上很好地工作。在Chrome浏览器中按F-11键可将页面全屏。


0

我刚遇到了一个类似的问题,解决方法是我使用了循环:

  • 测试位置
  • 移动
  • 测试位置
  • 如果不行再次移动

这种方法总是在不到两轮内就奏效。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接