Java控制鼠标和键盘的方法

本文介绍如何使用Java SDK 1.3之后引入的Robot类进行自动化测试及屏幕捕获。通过两个示例程序,展示了如何控制鼠标移动和点击,以及如何进行键盘输入,并演示了如何截取屏幕图像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java SDK 1.3以后实现了Robot类。此类用于为测试自动化、自运行演示程序和其他需要控制鼠标和键盘的应用程序生成本机系统输入事件。Robot 的主要目的是便于 Java 平台实现自动测试。 使用该类生成输入事件与将事件发送到 AWT 事件队列或 AWT 组件的区别在于:事件是在平台的本机输入队列中生成的。例如,Robot.mouseMove 将实际移动鼠标光标,而不是只生成鼠标移动事件。 Robot中主要的鼠标和键盘控制方法有:

  • void keyPress(int keycode) 按下给定的键。
  • void keyRelease(int keycode) 释放给定的键。
  • void mouseMove(int x, int y) 将鼠标指针移动到给定屏幕坐标。
  • void mousePress(int buttons) 按下一个或多个鼠标按钮。
  • void mouseRelease(int buttons) 释放一个或多个鼠标按钮。
  • void mouseWheel(int wheelAmt) 在配有滚轮的鼠标上旋转滚轮。

下面就让我们来实战鼠标控制,实现一个简单的鼠标控制程序MouseController。程序功能很简单:随机移动鼠标并点击左键。

代码如下:

import java.awt.AWTException; import java.awt.Dimension; import java.awt.Robot; import java.awt.Toolkit; import java.awt.event.InputEvent; import java.util.Random;

/**  *  */

/**  * @author sxc 石新春  * @Create date 2007-11-6  */ public class MouseController implements Runnable {  private Dimension dim;  private Random rand;  private Robot robot;  private volatile boolean stop = false;  public MouseController() {   dim = Toolkit.getDefaultToolkit().getScreenSize();   rand = new Random();   try {    robot = new Robot();   } catch (AWTException ex) {    ex.printStackTrace();   }  }  public void run() {   while(!stop) {    int x = rand.nextInt(dim.width);    int y = rand.nextInt(dim.height);    robot.mouseMove(x, y);    robot.mousePress(InputEvent.BUTTON1_MASK);    try {     Thread.sleep(2000);    } catch (InterruptedException ex) {     ex.printStackTrace();    }   }  }  public synchronized void stop() {   stop = true;  }  public static void main(String[] args) {   MouseController mc = new MouseController();   Thread mcThread = new Thread(mc);   System.out.println("Mouse Controller start");   mcThread.start();   try {    Thread.sleep(60000);   } catch (InterruptedException ex) {    ex.printStackTrace();   }   mc.stop();   System.out.println("Mouse Controller stoped");  } } 当然键盘映射也类似,无非是使用void keyPress(int keycode)。

现在实现了控制鼠标和键盘,接下了我们要获取操作后的效果(屏幕截图)。好在Robot类也提供了一个方法:BufferedImage createScreenCapture(Rectangle screenRect);可以直接将全屏幕或某个屏幕区域的像素拷贝到一个BufferedImage对象中。

好,下面实战使用robot截屏,实现Capture程序,每隔5秒截屏一次。

代码如下:

import java.awt.AWTException; import java.awt.Canvas; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.Robot; import java.awt.Toolkit; import java.awt.image.BufferedImage;

import javax.swing.GroupLayout; import javax.swing.JFrame; import javax.swing.WindowConstants; import javax.swing.GroupLayout.Alignment;

/**  *  */

/**  * @author sxc 石新春  *@Create date 2007-11-6  */ public class Capture extends JFrame implements Runnable {  private Canvas screenCanvas;  private volatile boolean stop;  private Robot robot;  private Dimension dim;  public Capture() {   initComponents();   try {    robot = new Robot();   } catch (AWTException ex) {    ex.printStackTrace();   }   dim = Toolkit.getDefaultToolkit().getScreenSize();  }  private void initComponents() {   screenCanvas = new java.awt.Canvas();   setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);   stop = true;   setResizable(false);   GroupLayout layout = new GroupLayout(getContentPane());   getContentPane().setLayout(layout);   layout.setHorizontalGroup(    layout.createParallelGroup(Alignment.LEADING).addComponent(screenCanvas,GroupLayout.PREFERRED_SIZE, 519,GroupLayout.PREFERRED_SIZE) );    layout.setVerticalGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(screenCanvas,GroupLayout.PREFERRED_SIZE, 434,GroupLayout.PREFERRED_SIZE)   );   pack();  }  public static void main(String args[]) {   final Capture capture = new Capture();   EventQueue.invokeLater(new Runnable() {   public void run() {   capture.setVisible(true);   }   });   Thread cutThread = new Thread(capture);   cutThread.start();  }  public void run() {   stop = false;   while(!stop) {    BufferedImage bImage = robot.createScreenCapture(new Rectangle(dim.width, dim.height));    Graphics g = this.screenCanvas.getGraphics();    g.drawImage(bImage, 0, 0, this);    try {     Thread.sleep(5000);    } catch (InterruptedException ex) {     ex.printStackTrace();    }   }  }  private synchronized void stop() {   stop = true;  } }

例子二:

import java.awt.AWTException; import java.awt.Robot; import java.awt.event.KeyEvent; import java.io.IOException;  public class RobotExp {   public static void main(String[] args) {    try {     try {      Runtime.getRuntime().exec("notepad");//打开notepad     } catch (IOException e) {      // TODO 自动生成 catch 块      e.printStackTrace();     }     Robot robot = new Robot();     //定义3秒的延迟开始写     robot.delay(3000);     robot.keyPress(KeyEvent.VK_H);     robot.keyPress(KeyEvent.VK_I);     robot.keyPress(KeyEvent.VK_SPACE);     robot.keyPress(KeyEvent.VK_S);     robot.keyPress(KeyEvent.VK_X);     robot.keyPress(KeyEvent.VK_C);    } catch (AWTException e) {     e.printStackTrace();     }    }   }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值