繁体   English   中英

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

[英]Robot.mouseMove not moving to specified location properly

每当我为机器人运行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执行。 每次我这样做时,鼠标都会移动到不同的位置。

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%,看看是否有帮助。

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

我写了一个类来做正确的光标定位。 这也适用于 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;
            }

        }
    }

}

我刚刚遇到了类似的问题,为了解决它,我刚刚做了一个循环:

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

它总是在少于 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);
}

它在全屏模式下运行良好(正确位置), zoom=100% 在 chrome 中按 F-11 到全屏页面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM