2012-08-26 145 views
9

Estoy trabajando en un proyecto sobre control remoto, envíe conrdinate xey del cursor del cliente al servidor.Java Robot class que simula el movimiento del mouse humano

Pero

robot.mouseMove(x,y); 

sólo mover el cursor hasta el punto en particular sin mover el punto

Tengo encontrar este sencillo algorthim para simular el movimiento continuo de ratón de la forma del cursor original

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

Pero este algorthim todavía es demasiado simple, simplemente se mueve de un punto a otro punto lentamente, que aún a diferencia del comportamiento humano.

He leído algo de código cómoda de fuente abierta por el control remoto de la Web, y me encuentro con este proyecto http://code.google.com/p/java-remote-control/ está utilizando el MosueMovement llamada a un método de la clase MouseListener, que utilizan para realizar el "arrastre".

Me gustaría saber si alguien sabe la mejor manera de hacerlo.

+1

es posible que desee recopilar algunos datos de usuarios humanos y luego usarlos de varias maneras para replicar la simulación humana. –

+0

De su publicación, parece que su principal queja es que la velocidad de movimiento del mouse es incorrecta. Si ese es el problema principal, entonces puedes ajustar tu código para hacer que el movimiento del mouse sea una velocidad constante, y luego ajustar esa velocidad hasta que esté cerca de lo óptimo. –

+1

Quizás podría [Alt] + [Tab] un par de veces y revisar el correo electrónico y Facebook en el camino de A a B. En serio, creo que registrar el movimiento del mouse de un par de usuarios podría ser un experimento interesante para hacer esto más realista Sería bueno tener en cuenta un par de variables, como la posición X, Y, velocidad, tiempo, dirección actual, ejecutar Rapid Miner y ver qué se puede extraer de él. Quizás puedas encontrar un algoritmo más sofisticado. – toniedzwiedz

Respuesta

8

Hay algunas cosas a considerar si usted quiere hacer el movimiento artificial natural, pienso:

  1. movimiento del ratón humano está generalmente en un ligero arco, porque los pivotes de la mano del ratón alrededor de la muñeca. También ese arco es más pronunciado para movimientos horizontales que verticales.
  2. Los seres humanos tienden a ir en la dirección general, a menudo rebasan el objetivo y luego regresan al objetivo real.
  3. La velocidad inicial hacia el objetivo es bastante rápida (de ahí el sobreimpulso antes mencionado) y luego un poco más lenta para una orientación precisa. Sin embargo, si el cursor está cerca del objetivo inicialmente, el movimiento rápido hacia él no ocurre (y tampoco lo hace el sobreimpulso).

Sin embargo, es algo complejo de formular en algoritmos.

+0

Gracias por seguir, estoy trabajando en el proyecto de control remoto desde el teléfono Android al escritorio, la mayoría de las personas lo hicieron bien pero miran usar java para escribir la función es un poco difícil, voy a seguir trabajando en esto –

4

Eche un vistazo en este ejemplo que escribí. Puedes mejorar esto para simular lo que dijo Joey. Lo escribí muy rápido y hay muchas cosas que se pueden mejorar (algoritmo y diseño de clase). Tenga en cuenta que solo trato con movimientos de izquierda a derecha.

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

Gracias por el código, Voy a seguir trabajando y ver qué puedo hacer en él –

+0

¡De nada! – davidbuzatto

Cuestiones relacionadas