web-dev-qa-db-fra.com

Robot.mouseMove ne se déplace pas correctement vers l'emplacement spécifié

Chaque fois que j'exécute une commande mouseMove pour un robot, la souris ne se place pas toujours au même emplacement. Par exemple, j'ai le code suivant:

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

Le code fait généralement que la souris se retrouve au X:

 Mouse Location after running Tout d'abord, je clique sur Exécuter (j'utilise Eclipse) et déplace ma souris vers un emplacement (avant que le délai de 2 secondes ne soit écoulé). Ensuite, le délai de 2 secondes se termine et la souris se déplace, puis le script se termine. Le problème est que la souris ne semble jamais aller au même endroit deux fois. Par exemple, la souris doit aller à (100, 300) mais à quelque chose qui ressemble à (0, 300) la plupart du temps. D'autres fois, cependant, si je déplace la souris au début, là où elle devrait être approximativement, alors elle ira au bon endroit. 

Je me demande où la souris devrait utiliser Paint pour obtenir l’emplacement de pixel d’une capture d’écran, mais je ne pense pas que c’est parce que cet emplacement ne cesse de changer.

Y a-t-il quelque chose qui me manque, comment fonctionnent les coordonnées pour mouseMove

Edit: En gros, je lance le programme avec ce programme, puis je déplace la souris vers une nouvelle position (il y a donc une position initiale différente avant la fonction mouseMove), puis mouseMove est exécuté. Chaque fois que je fais cela, la souris va à un endroit différent.

7
DarkHorse

J'ai écrit une classe pour faire le bon positionnement du curseur . Cela fonctionne aussi sous Windows 10.

Utilisez la fonction MoveMouseControlled (double, double) pour déplacer le curseur à une position spécifiée. Il utilise un système de coordonnées [0,1]. Le point (0,0) est le coin supérieur gauche de l'écran.

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

        }
    }

}
1
Gats János

Il y a un bogue ouvert sur OpenJDK, donc cela pourrait être lié:

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)

Les détails du bogue qu'un problème peut avoir été introduit dans la mise à jour de Windows 10 Fall Creators, liés à la mise à l'échelle de l'écran et à une fonction mouse_move.

En attendant, vous pouvez essayer de régler l’échelle de votre écran sur 100% au lieu de 125% et voir si cela aide.

0
Syl

J'ai trouvé une solution, il suffit de déplacer la souris vers la coordonnée (0,0) pour la déplacer ensuite à l'endroit souhaité.

0
martin eduardo mtz