2010-05-31 75 views

回答

19

您需要使用Robot

此类用于为测试自动化,自运行演示,并在需要控制鼠标和键盘的其他应用程序的目的本地系统输入事件。 Robot的主要目的是促进Java平台实现的自动化测试。

使用该类生成输入事件不同于将事件发布到AWT事件队列或AWT组件,因为事件是在平台的本机输入队列中生成的。例如,Robot.mouseMove将实际移动鼠标光标,而不是只生成鼠标移动事件的...

+0

很好,谢谢。这看起来正是我需要的。 – 2010-05-31 04:16:07

18

正如其他人所说,这可以使用Robot.mouseMove(x,y)实现。然而,这种解决方案在多显示器情况下工作时会出现问题,因为机器人使用主屏幕的坐标系统工作,除非您另行指定。

这里是一个解决方案,允许您通过任何基于点全局屏幕坐标:

public void moveMouse(Point p) { 
    GraphicsEnvironment ge = 
     GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    GraphicsDevice[] gs = ge.getScreenDevices(); 

    // Search the devices for the one that draws the specified point. 
    for (GraphicsDevice device: gs) { 
     GraphicsConfiguration[] configurations = 
      device.getConfigurations(); 
     for (GraphicsConfiguration config: configurations) { 
      Rectangle bounds = config.getBounds(); 
      if(bounds.contains(p)) { 
       // Set point to screen coordinates. 
       Point b = bounds.getLocation(); 
       Point s = new Point(p.x - b.x, p.y - b.y); 

       try { 
        Robot r = new Robot(device); 
        r.mouseMove(s.x, s.y); 
       } catch (AWTException e) { 
        e.printStackTrace(); 
       } 

       return; 
      } 
     } 
    } 
    // Couldn't move to the point, it may be off screen. 
    return; 
} 
+0

它在Linux平台上工作吗? – 2014-07-24 14:40:40

+2

@丹尼尔 - 自从你在这里回复已经有好几年了,但今天我找到了它,并且它解决了我多年来无意中通过鼠标点击重新定位文本光标所遇到的问题。我很想试用Robot.mouseMove,直到我阅读你的评论。奇怪的是,我刚开始使用多显示器设置!既然你使用了我不熟悉的类,我感到震惊的是我所要做的只是复制你的代码,做一些导入,然后调用它。做得好!谢谢!! – DSlomer64 2015-02-17 18:15:07