Java入坑之Robot类

一、概述

1.1Robot类概述

在Java中,Robot是一个属于java.awt包的类。它还扩展了 Object 类。该类用于为测试自动化、自运行演示以及需要控制鼠标和键盘的其他应用程序生成本机系统输入事件。换句话说,我们使用 Java Robot 类来触发输入事件,例如鼠标单击、按键等。

可以用于测试自动化、自运行演示或其他需要控制鼠标和键盘的应用程序

1.2常用方法

方法名称 描述

createScreenCapture(Rectangle screenRect)

创建屏幕捕获(矩形屏幕矩形)

该方法以矩形从屏幕捕获图像

delay(int ms)

延迟(整数毫秒)

它用于睡眠指定的时间。
getAutoDelay() 它返回此机器人在生成事件后休眠的毫秒数。
getPixelColor(int x, int y) 它返回指定坐标的像素的颜色
isAutoWaitForIdle() 该方法返回此机器人在生成事件后是否自动调用 waitForIdle()。

keyPress(int keycode)

按键(整数键代码)

该方法特定键。
keyRelease(int keycode) 释放指定的密钥。
mouseMove(int x, int y) 它将鼠标指针移到指定的坐标上。

keyPress(int keycode)

鼠标按下(整数按钮)

按下鼠标按钮。

mouseRelease(int buttons)

鼠标释放(整数按钮)

该方法释放鼠标按钮。
mouseWheel(int wheelAmt) 它会滚动鼠标滚轮。

mouseRelease(int buttons)

设置自动延迟(整数毫秒)

它设置此机器人在生成事件后休眠的毫秒数。
setAutoWaitForIdle(boolean isOn) 它设置此机器人在生成事件后是否自动调用 waitForIdle() 方法。
toString() 它返回机器人的字符串表示形式。
waitForIdle() 它会等待,直到当前事件队列上的所有事件都已处理完毕。

1.3代码演示

这段代码的主要作用是打开记事本应用程序,然后使用Robot类模拟键盘输入一系列字符,每个字符之间暂停500毫秒。这个示例可以用于演示如何使用Java程序来控制键盘输入

package org.example;

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.io.*;

public class KeyBoardControlExample {
    public static void main(String args[]) throws IOException, AWTException, InterruptedException {
        // 定义要执行的命令,这里是打开记事本
        String command = "notepad.exe";
        Runtime run = Runtime.getRuntime();
        
        // 执行操作系统命令,启动记事本应用程序
        run.exec(command);

        try {
            // 延迟等待4秒(4000毫秒),以确保记事本程序完全启动
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            // 处理中断异常
            e.printStackTrace();
        }

        // 创建Robot类的实例,用于模拟键盘输入
        Robot robot = new Robot();

        // 模拟按下键盘上的各个键,每个键按下后等待500毫秒
        robot.keyPress(KeyEvent.VK_W); // 按下 'W'
        Thread.sleep(500);
        robot.keyPress(KeyEvent.VK_E); // 按下 'E'
        Thread.sleep(500);
        robot.keyPress(KeyEvent.VK_L); // 按下 'L'
        Thread.sleep(500);
        robot.keyPress(KeyEvent.VK_C); // 按下 'C'
        Thread.sleep(500);
        robot.keyPress(KeyEvent.VK_O); // 按下 'O'
        Thread.sleep(500);
        robot.keyPress(KeyEvent.VK_M); // 按下 'M'
        Thread.sleep(500);
        robot.keyPress(KeyEvent.VK_E); // 按下 'E'
        Thread.sleep(500);
        robot.keyPress(KeyEvent.VK_SPACE); // 按下空格键
        Thread.sleep(500);
        robot.keyPress(KeyEvent.VK_T); // 按下 'T'
        Thread.sleep(500);
        robot.keyPress(KeyEvent.VK_O); // 按下 'O'
        Thread.sleep(500);
        robot.keyPress(KeyEvent.VK_SPACE); // 按下空格键
        Thread.sleep(500);
        robot.keyPress(KeyEvent.VK_J); // 按下 'J'
        Thread.sleep(500);
        robot.keyPress(KeyEvent.VK_A); // 按下 'A'
        Thread.sleep(500);
        robot.keyPress(KeyEvent.VK_V); // 按下 'V'
        Thread.sleep(500);
        robot.keyPress(KeyEvent.VK_A); // 按下 'A'
        Thread.sleep(500);
        robot.keyPress(KeyEvent.VK_T); // 按下 'T'
        Thread.sleep(500);
        robot.keyPress(KeyEvent.VK_P); // 按下 'P'
        Thread.sleep(500);
        robot.keyPress(KeyEvent.VK_O); // 按下 'O'
        Thread.sleep(500);
        robot.keyPress(KeyEvent.VK_I); // 按下 'I'
        Thread.sleep(500);
        robot.keyPress(KeyEvent.VK_N); // 按下 'N'
        Thread.sleep(500);
        robot.keyPress(KeyEvent.VK_T); // 按下 'T'
        Thread.sleep(500);
    }
}

 代码优化

package org.example;

import java.awt.*;
import java.awt.event.KeyEvent;

class Robo {
    // 自定义休眠方法
    public static void sleep(long ms) {
        try {
            Thread.sleep(ms);
        } catch (Exception ignored) {
        }
    }

    public static void main(String[] args) throws Exception {
        // 打开记事本应用程序
        Runtime.getRuntime().exec("notepad.exe");

        // 等待2秒
        sleep(2000);

        // 创建Robot类的实例
        Robot robot = new Robot();

        // 要输入的字符串
        String str = "Hello from GeeksforGeeks";

        // 使用Robot模拟按键操作
        // 每次按键之间间隔200毫秒

        for (int i = 0; i < str.length(); i++) {
            // 检查当前字符是否是大写字母
            if (Character.isUpperCase(str.charAt(i))) {
                // 按下Shift键
                robot.keyPress(KeyEvent.VK_SHIFT);
                // 按下当前字符的大写形式
                robot.keyPress(Character.toUpperCase(str.charAt(i)));
                // 释放Shift键
                robot.keyRelease(KeyEvent.VK_SHIFT);
            }
            // 否则按下字符本身
            else
                robot.keyPress(Character.toUpperCase(str.charAt(i)));
            // 等待200毫秒
            sleep(200);
        }
    }
}

1.4应用场景

  • 测试自动化:Robot类可以模拟用户的鼠标和键盘操作,对软件或网页进行自动化的测试,检查其功能和性能是否正常。例如,Robot类可以用来测试Java Swing组件的交互效果¹。
  • 自运行演示:Robot类可以用来制作一些自动运行的演示程序,展示软件或网页的功能和特点。例如,Robot类可以用来制作一个自动在画板上画图的演示程序²。
  • 游戏辅助:Robot类可以用来开发一些游戏辅助工具,通过分析屏幕上的像素颜色和位置,控制鼠标和键盘进行游戏操作。例如,Robot类可以用来实现一个“别踩白块”游戏的辅助程序³。

二、键盘事件

Java中的Robot类可以用于模拟各种键盘事件,包括按下键、释放键和键盘字符事件。以下是一些常见的键盘事件以及如何使用Robot类模拟它们:

2.1按下键: 

要模拟按下键盘上的某个键,您可以使用keyPress方法,并传递一个表示键的常量,例如KeyEvent.VK_KEY,其中"KEY"是要模拟的键的名称。例如,模拟按下"A"键:

import java.awt.*;
import java.awt.event.KeyEvent;

public class KeyPressExample {
    public static void main(String[] args) throws AWTException {
        Robot robot = new Robot();
        robot.keyPress(KeyEvent.VK_A); // 按下"A"键
    }
}

2.2释放键:

要模拟释放键盘上的某个键,您可以使用keyRelease方法,也需要传递表示键的常量。例如,模拟释放"A"键:

import java.awt.*;
import java.awt.event.KeyEvent;

public class KeyReleaseExample {
    public static void main(String[] args) throws AWTException {
        Robot robot = new Robot();
        robot.keyRelease(KeyEvent.VK_A); // 释放"A"键
    }
}

2.3键盘字符事件:

若要模拟键盘字符事件,例如输入文本,您可以使用keyPress和keyRelease方法结合使用,但不需要传递常量。相反,您需要传递字符的ASCII值。例如,模拟键盘输入字符"A":

import java.awt.*;
import java.awt.event.KeyEvent;

public class KeyTypedExample {
    public static void main(String[] args) throws AWTException {
        Robot robot = new Robot();
        robot.keyPress(KeyEvent.VK_SHIFT); // 按下Shift键
        robot.keyPress(KeyEvent.VK_A); // 按下"A"键
        robot.keyRelease(KeyEvent.VK_A); // 释放"A"键
        robot.keyRelease(KeyEvent.VK_SHIFT); // 释放Shift键
    }
}

这些是一些基本的键盘事件示例,您可以根据需要组合它们以模拟更复杂的键盘操作。请注意,模拟键盘事件可能需要处理AWT异常(java.awt.AWTException)并确保具有足够的权限来执行这些操作。

三、鼠标事件

Java的Robot类也可以用于模拟鼠标事件,包括鼠标移动、鼠标按键按下和释放等。以下是一些常见的鼠标事件以及如何使用Robot类模拟它们:

3.1鼠标移动:

要模拟鼠标移动,您可以使用mouseMove方法,传递要移动到的屏幕坐标。例如,将鼠标移动到屏幕坐标(100, 100):

import java.awt.*;

public class MouseMoveExample {
    public static void main(String[] args) throws AWTException {
        Robot robot = new Robot();
        robot.mouseMove(100, 100); // 移动鼠标到坐标(100, 100)
    }
}

3.2鼠标按键按下和释放:

要模拟鼠标按键的按下和释放事件,您可以使用mousePress和mouseRelease方法,分别传递表示鼠标按键的常量。例如,模拟按下和释放左键:

import java.awt.*;
import java.awt.event.InputEvent;

public class MouseClickExample {
    public static void main(String[] args) throws AWTException {
        Robot robot = new Robot();
        robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); // 按下左键
        robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); // 释放左键
    }
}

3.3鼠标滚轮滚动:

若要模拟鼠标滚轮滚动,可以使用mouseWheel方法,并传递表示滚动量的整数值。正值表示向前滚动,负值表示向后滚动。例如,模拟向前滚动鼠标滚轮三次:

import java.awt.*;

public class MouseWheelExample {
    public static void main(String[] args) throws AWTException {
        Robot robot = new Robot();
        robot.mouseWheel(3); // 向前滚动鼠标滚轮三次
    }
}


这些是一些基本的鼠标事件示例,您可以根据需要组合它们以模拟更复杂的鼠标操作。请注意,模拟鼠标事件也可能需要处理AWT异常(java.awt.AWTException)并确保具有足够的权限来执行这些操作。

3.4示例代码

import java.awt.*;
import java.awt.event.InputEvent;

public class MouseEventsDemo {
    public static void main(String[] args) {
        try {
            Robot robot = new Robot();
            robot.setAutoDelay(500); // 设置事件之间的延迟(毫秒)

            // 移动鼠标到坐标(300, 300)
            robot.mouseMove(300, 300);

            // 模拟点击左键
            robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
            robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);

            // 等待一段时间
            robot.delay(1000);

            // 模拟点击右键
            robot.mousePress(InputEvent.BUTTON3_DOWN_MASK);
            robot.mouseRelease(InputEvent.BUTTON3_DOWN_MASK);

            // 等待一段时间
            robot.delay(1000);

            // 模拟向前滚动鼠标滚轮3次
            robot.mouseWheel(3);

            // 等待一段时间
            robot.delay(1000);

            // 模拟向后滚动鼠标滚轮2次
            robot.mouseWheel(-2);
        } catch (AWTException e) {
            e.printStackTrace();
        }
    }
}

四、应用

4.1屏幕截图

package org.example;

import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;

public class RobotExample {
    public static void main(String[] args) throws AWTException, IOException {
        Robot robot = new Robot();

        // 设置延迟(毫秒值)
        robot.delay(1000);

        // 模拟鼠标按下和释放操作
        int mouseButton = InputEvent.BUTTON1_DOWN_MASK; // 鼠标左键
        robot.mousePress(mouseButton);
        robot.mouseRelease(mouseButton);

        // 移动鼠标到指定位置(x, y)
        int x = 100;
        int y = 100;
        robot.mouseMove(x, y);

        // 模拟鼠标滚动(向下滚动)
        int wheelAmt = 3; // 向下滚动3格
        robot.mouseWheel(wheelAmt);

        // 模拟键盘按下和释放操作
        int keycode = KeyEvent.VK_WINDOWS; // Windows键
        robot.keyPress(keycode);
        robot.keyRelease(keycode);

        // 获取指定坐标处的像素颜色
        int pixelColorX = 200;
        int pixelColorY = 200;
        Color color = robot.getPixelColor(pixelColorX, pixelColorY);

        // 获取指定矩形区域的屏幕截图
        int captureX = 100;
        int captureY = 100;
        int captureWidth = 500;
        int captureHeight = 500;
        BufferedImage screenshot = robot.createScreenCapture(new Rectangle(captureX, captureY, captureWidth, captureHeight));

        // 保存截图为JPEG文件
        File outputFile = new File("D:\\桌面\\save.jpg");
        OutputStream os = new FileOutputStream(outputFile);
        ImageIO.write(screenshot, "jpg", os);
    }
}

4.2消息轰炸器

package auto_control;

import java.awt.*;
import java.awt.event.KeyEvent;

/**
 * @Author Javee
 * @Date 2019/8/11 19:54
 * @Description  一个简单的QQ/微信轰炸器
 *                 用法:把需要发送的信息先复制到电脑的粘贴板(Ctrl + C),
 *                 再运行此代码,然后打开需要轰炸的对象聊天窗口,点击一下
 *                 输入区即可自动轰炸
 * */
public class Boom {
    public static void main(String[] args) throws AWTException {
        Robot robot = new Robot();// 创建Robot对象

        int times = 50; //轰炸的次数,可以自己修改
        int time = 500; //两次轰炸之间相隔的时间,单位为毫秒

        robot.delay(3000);// 延迟三秒,主要是为了预留出打开窗口的时间,括号内的单位为毫秒

        for (int j = 0; j < times; j++) {//循环次数
            // 以下两行按下了ctrl+v,完成粘贴功能
            robot.keyPress(KeyEvent.VK_CONTROL);
            robot.keyPress(KeyEvent.VK_V);
            robot.keyRelease(KeyEvent.VK_CONTROL);// 释放ctrl按键,像ctrl,退格键,删除键这样的功能性按键,在按下后一定要释放,不然会出问题。crtl如果按住没有释放,在按其他字母按键是,敲出来的回事ctrl的快捷键。
            robot.delay(time);// 延迟发送,不然会一次性全发布出去,因为电脑的处理速度很快,每次粘贴发送的速度几乎是一瞬间,所以给人的感觉就是一次性发送了全部。这个时间可以自己改,想几秒发送一条都可以
            robot.keyPress(KeyEvent.VK_ENTER);// 回车
            robot.keyRelease(KeyEvent.VK_ENTER);
        }
    }
}

4.3自动化数据输入

import java.awt.*;
import java.awt.event.KeyEvent;

public class AutoDataInput {
    public static void main(String[] args) {
        try {
            // 创建Robot对象
            Robot robot = new Robot();

            // 打开记事本应用程序(可根据您的需求更改应用程序路径)
            Runtime.getRuntime().exec("notepad.exe");
            Thread.sleep(2000); // 等待应用程序打开

            // 输入文本
            String textToType = "这是自动化数据输入的示例。";
            for (char c : textToType.toCharArray()) {
                int keyCode = KeyEvent.getExtendedKeyCodeForChar(c);
                if (KeyEvent.CHAR_UNDEFINED != keyCode) {
                    robot.keyPress(keyCode);
                    robot.keyRelease(keyCode);
                }
            }

            // 保存文档(Ctrl + S)
            robot.keyPress(KeyEvent.VK_CONTROL);
            robot.keyPress(KeyEvent.VK_S);
            robot.keyRelease(KeyEvent.VK_S);
            robot.keyRelease(KeyEvent.VK_CONTROL);

            // 关闭记事本(Alt + F4)
            robot.keyPress(KeyEvent.VK_ALT);
            robot.keyPress(KeyEvent.VK_F4);
            robot.keyRelease(KeyEvent.VK_F4);
            robot.keyRelease(KeyEvent.VK_ALT);
        } catch (AWTException | InterruptedException | java.io.IOException e) {
            e.printStackTrace();
        }
    }
}

你可能感兴趣的:(java,开发语言)