Java Robot class simulating human mouse movement

后端 未结 3 899
离开以前
离开以前 2021-02-08 17:58

I am working on a project about remote control, send conrdinate x and y of cursor from client to server.

But

robot.mouseMove(x,y);

wi

相关标签:
3条回答
  • 2021-02-08 18:38

    There are a few things to consider if you want to make the artificial movement natural, I think:

    1. Human mouse movement is usually in a slight arc because the mouse hand pivots around the wrist. Also that arc is more pronounced for horizontal movements than vertical.
    2. Humans tend to go in the general direction, often overshoot the target and then go back to the actual target.
    3. Initial speed towards the target is quite fast (hence the aforementioned overshoot) and then a bit slower for precise targeting. However, if the cursor is close to the target initially the quick move towards it doesn't happen (and neither does the overshoot).

    This is a bit complex to formulate in algorithms, though.

    0 讨论(0)
  • 2021-02-08 18:42

    Take a look in this example that I wrote. You can improve this to simulate what Joey said. I wrote it very fast and there are lots of things that can be improved (algorithm and class design). Note that I only deal with left to right movements.

    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();
                    }
    
                }
    
            }
    
        }
    
    }
    
    0 讨论(0)
  • 2021-02-08 18:46

    For anyone in the future: I developed a library for Java, that mimics human mouse movement. The noise/jaggedness in movement, sinusoidal arcs, overshooting the position a bit, etc. Plus the library is written with extension and configuration possibilities in mind, so anyone can fine tune it, if the default solution is not matching the case. Available from Maven Central now.

    https://github.com/JoonasVali/NaturalMouseMotion

    0 讨论(0)
提交回复
热议问题