Класс Java Robot, имитирующий движение человеческой мыши

Я работаю над проектом о дистанционном управлении, отправляю conrdinate X и y курсора с клиента на сервер.

но

robot.mouseMove(x,y);

будет перемещать курсор только в определенную точку, не перемещая курсор в исходную точку

Я нашел эту простую algorthim для имитации продолжая движение мыши

for (int i=0; i<100; i++){
   int x = ((end_x * i)/100) + (start_x*(100-i)/100);
 int y = ((end_y * i)/100) + (start_y*(100-i)/100);
 robot.mouseMove(x,y);
} 

но этот алгоритм все еще слишком прост, он просто медленно перемещается из одной точки в другую, что все еще не похоже человеческое поведение.

Я прочитал некоторый открытый код soruce о дистанционном управлении из интернета, и я нахожу этот проект http://code.google.com/p/java-remote-control/ использует метод вызова MosueMovement из класса MouseListener, который они используют для выполнения "перетаскивания".

мне нравится знать, кто-нибудь знает лучший способ сделать это?

2 ответов


есть несколько вещей, чтобы рассмотреть, если вы хотите сделать искусственное движение естественным, я думаю:

  1. человеческое движение мыши обычно находится в небольшой дуге, потому что рука мыши поворачивается вокруг запястья. Кроме того, эта дуга более выражена для горизонтальных движений, чем для вертикальных.
  2. люди, как правило, идут в общем направлении, часто перекрывают цель, а затем возвращаются к фактической цели.
  3. Начальная скорость к цели довольно быстрая (следовательно вышеупомянутое превышение), а затем немного медленнее для точного таргетинга. Однако, если курсор изначально близок к цели, быстрый переход к ней не происходит (и не происходит проскока).

Это немного сложно сформулировать в алгоритмах, хотя.


взгляните на этот пример, который я написал. Вы можете улучшить это, чтобы имитировать то, что сказал Джоуи. Я написал его очень быстро, и есть много вещей, которые можно улучшить (алгоритм и дизайн класс). Обратите внимание, что я имею дело только с движениями слева направо.

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

public class MouseMoving {

    public static void main(String[] args) {
        new MouseMoving().execute();
    }

    public void execute() {
        new Thread( new MouseMoveThread( 100, 50, 50, 10 ) ).start();
    }

    private class MouseMoveThread implements Runnable {

        private Robot robot;
        private int startX;
        private int startY;
        private int currentX;
        private int currentY;
        private int xAmount;
        private int yAmount;
        private int xAmountPerIteration;
        private int yAmountPerIteration;
        private int numberOfIterations;
        private long timeToSleep;

        public MouseMoveThread( int xAmount, int yAmount,
                int numberOfIterations, long timeToSleep ) {

            this.xAmount = xAmount;
            this.yAmount = yAmount;
            this.numberOfIterations = numberOfIterations;
            this.timeToSleep = timeToSleep;

            try {

                robot = new Robot();

                Point startLocation = MouseInfo.getPointerInfo().getLocation();
                startX = startLocation.x;
                startY = startLocation.y;

            } catch ( AWTException exc ) {
                exc.printStackTrace();
            }

        }

        @Override
        public void run() {

            currentX = startX;
            currentY = startY;

            xAmountPerIteration = xAmount / numberOfIterations;
            yAmountPerIteration = yAmount / numberOfIterations;

            while ( currentX < startX + xAmount &&
                    currentY < startY + yAmount ) {

                currentX += xAmountPerIteration;
                currentY += yAmountPerIteration;

                robot.mouseMove( currentX, currentY );

                try {
                    Thread.sleep( timeToSleep );
                } catch ( InterruptedException exc ) {
                    exc.printStackTrace();
                }

            }

        }

    }

}