2012-08-26 66 views
9

我正在开发一个关于远程控制的项目,发送光标从客户机到服务器的conrdinate x和y。模拟人类鼠标移动的Java机器人类

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

但是这个algorthim仍然过于简单,它只是从一个点慢慢移动到另一个点,这仍然不像人类的行为。

我看了一下从网络的远程控制一些开放soruce代码,我觉得这个项目 http://code.google.com/p/java-remote-control/ 使用从MouseListener的类中的方法调用MosueMovement,他们用它来执行“拖”。

我想知道是否有人知道这样做的更好方法?

+1

您可能希望从人类用户那里收集一些数据,然后以各种方式使用该数据来复制人体模拟。 –

+0

从您的帖子看来,您的主要抱怨是鼠标移动速度错误。如果这是主要问题,那么您可以调整代码以使鼠标移动速度保持恒定,然后调整该速度直至接近最佳。 –

+1

也许你可以[Alt] + [Tab]几次,然后在从A到B的路上查看电子邮件和脸书。但是,我认为记录一些用户的鼠标移动可能是一个有趣的实验。使这更现实。考虑到X,Y位置,速度,时间,当前方向,运行Rapid Miner以及可以从中提取的内容等几​​个变量将会很酷。也许你会想出一个更复杂的算法。 – toniedzwiedz

回答

8

有,如果你想使人工运动,自然要考虑几件事情,我认为:

  1. 人力鼠标移动通常是轻微的弧度,因为绕在手腕上的鼠标手转动。此外,该弧对于水平运动比垂直运动更显着。
  2. 人类往往走向大方向,往往超出目标,然后回到实际目标。
  3. 朝向目标的初始速度相当快(因此上述过冲),然后精确瞄准速度稍慢。但是,如果光标最初靠近目标,则快速移向目标不会发生(超调也不会发生)。

虽然这在制定算法时有点复杂。

+0

感谢您的支持,我正致力于从Android手机到桌面的远程控制项目,大部分人都做得很好,但看起来用java编写的功能有点困难,我会继续努力这个 –

4

看看我写的这个例子。你可以改进这个来模拟乔伊说的话。我写得非常快,有很多东西可以改进(算法和类设计)。请注意,我只处理从左到右的动作。

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

不客气! – davidbuzatto