java - Robot.mouseMove flytter ikke til angivet sted korrekt

Indlæg af Hanne Mølgaard Plasc

Problem



Når jeg kører en mouseMove kommando til en robot, går musen ikke altid til samme sted. For eksempel har jeg følgende kode:


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


Koden gør normalt musen ender i X:


Mus placering efter kørsel
Først rammer jeg (jeg bruger eclipse) og flytter musen til et sted (før 2 sekunders timer er op). Så slutter 2 sekunders forsinkelse, og musen bevæger sig, og så slutter scriptet. Problemet er, at musen aldrig synes at gå til det samme nøjagtige sted to gange. For eksempel skal musen gå til (100, 300), men det går til noget, der ligner (0, 300) det meste af tiden. Andre gange, men hvis jeg bevæger musen i begyndelsen til hvor den i det store og hele skal være, så går den til det rigtige sted. [9]


Jeg får hvor musen skal bruge Paint for at få pixel placering af et screenshot, men jeg tror ikke, det er det, fordi lokationen holder ved at ændre sig.


Er der noget, jeg mangler, hvordan koordinaterne til mouseMove virker?


 Grundlæggende rammer jeg starten med det pågældende program, så flytter jeg musen til en ny position (så der er en anden startposition før funktionen mouseMove og derefter mouseMove udføres. Hver gang jeg gør dette, går musen til en anden placering.

Bedste reference


Der er en åben fejl på OpenJDK, så dette kunne være relateret:


https://bugs.openjdk.java.net/browse/JDK-8196030?jql=project\%20in\%20 (JDK)\% 20and\% 20component\% 20in\% 20 (klient-libs)\% 20and\% 20Subcomponent\% 20in\% 20 ( java.awt) [10]


Fejloplysningerne om, at et problem kan have været introduceret i Windows 10 Fall Creators opdatering, relateret til skærmskalering og en mouse\_move-funktion.


I mellemtiden kan du forsøge at indstille din skærmskala til 100\% i stedet for 125\% og se om den hjælper.

Andre referencer 1


Jeg skrev en klasse for at lave korrekt markørpositionering.
Dette virker også under vinduer 10 skalinger.


Brug MoveMouseControlled (dobbelt, dobbelt) funktion til at flytte markøren til en bestemt position. Det bruger et [[0,1]] koordinatsystem. (0,0) Punktet er øverste venstre hjørne af skærmen.


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

        }
    }

}