10

私はリモートコントロールに関するプロジェクトに取り組んでおり、カーソルのconrdinate xとyをクライアントからサーバーに送信しています。

しかし

robot.mouseMove(x,y);

元のポイントからカーソルを移動せずに、カーソルを特定のポイントに移動するだけです

マウスの継続的な動きをシミュレートするこの単純なアルゴリズムを見つけました

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

しかし、このアルゴリズムはまだ単純すぎて、ある点から別の点へゆっくりと移動するだけで、人間とは異なる振る舞いをします。

Web からのリモート コントロールに関するオープン ソース コードをいくつか読みましたが、このプロジェクト http://code.google.com/p/java-remote-control/ が MouseListener クラスのメソッド呼び出し MosueMovement を使用していることがわかりました。 「ドラッグ」を実行します。

これを行うより良い方法を知っている人はいますか?

4

3 に答える 3

10

人工的な動きを自然なものにしたい場合、考慮すべき点がいくつかあると思います。

  1. マウスの手は手首を中心に回転するため、人間のマウスの動きは通常わずかな弧を描いています。また、その弧は、垂直方向よりも水平方向の動きの方が顕著です。
  2. 人間は一般的な方向に進む傾向があり、多くの場合、ターゲットをオーバーシュートしてから実際のターゲットに戻ります。
  3. ターゲットへの初期速度は非常に速く (したがって、前述のオーバーシュート)、正確なターゲティングのために少し遅くなります。ただし、最初にカーソルがターゲットの近くにある場合、その方向への素早い移動は発生しません (オーバーシュートも発生しません)。

ただし、これをアルゴリズムで定式化するのは少し複雑です。

于 2012-08-26T15:46:12.460 に答える
5

私が書いたこの例を見てください。これを改善して、ジョーイが言ったことをシミュレートできます。私はそれを非常に速く書きました、そして改善できることがたくさんあります(アルゴリズムとクラスデザイン)。私は左から右への動きだけを扱っていることに注意してください。

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

            }

        }

    }

}
于 2012-08-26T15:59:00.937 に答える