Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java Robot class simulating human mouse movement

Tags:

java

mouse

awt

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

will only move the cursor to the particular point without moving the cursor form origional point

I have find this simple algorthim to simulate the continuing movement of mouse

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

But this algorthim still too simple, it just move from one point to other point slowly, which still unlike human behave.

I have read some open soruce code about remote control from web, and I find this project http://code.google.com/p/java-remote-control/ is using the method call MosueMovement from MouseListener class, which they use to perform the "dragging".

I like to know is any one know the better way of doing this?

like image 263
Shawn Lien Avatar asked Aug 26 '12 15:08

Shawn Lien


2 Answers

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

like image 57
Joonas Vali Avatar answered Oct 06 '22 00:10

Joonas Vali


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.

like image 36
Joey Avatar answered Oct 06 '22 00:10

Joey