简介:此类用于生成本机系统输入事件,出于测试自动化、自运行演示和其他可以控制鼠标和键盘的应用程序这是需要的。机器人的主要目的是方便用户Java平台实现的自动化测试

方法介绍及解析:以下private开头方法为Robot内部使用,方法,public方法为对外开放方法,请重点关注public方法

Robot中对外提供接口

1. 实例化方法

new Robot(); 无参实例化,详见1

new Robot(
GraphicsEnvironment.getLocalGraphicsEnvironment()
.getDefaultScreenDevice());

带参实例化,详见2

2. 屏幕截图

    Robot robot = new Robot();  //初始化Robot对象
    Rectangle rect = new Rectangle(0, 0, 50, 50);  //构建范围
    BufferedImage buffer = robot.createScreenCapture(rect); //截取	详见17,截取固定区域屏幕图片

3. 延时休眠

robot.delay(1000);	//延时1秒,详见23

4. 键盘模拟

robot.keyPress(KeyEvent.VK_A);	//按下A键,键盘上所有按键的ASCII码都在KeyEvent中定义了静态常量
robot.keyRelease(KeyEvent.VK_A);	//弹起A键

5. 鼠标模拟

robot.mouseMove(10,20);	//将鼠标移动至(10,20)这个坐标点
robot.mousePress(InputEvent.BUTTON1_MASK);//左键

robot.mousePress(InputEvent.BUTTON2_MASK);//中键(早期鼠标才有,已被滚轮替代)

robot.mousePress(InputEvent.BUTTON3_MASK)//右键

鼠标按下事件

robot.mouseRelease(InputEvent.BUTTON1_MASK);//左键

robot.mouseRelease(InputEvent.BUTTON2_MASK);//中键(早期鼠标才有,已被滚轮替代)

robot.mouseRelease(InputEvent.BUTTON3_MASK)//右键

鼠标弹起事件

robot.mouseWheel(key);	

鼠标滚轮事件

1.Robot无参构造方法

此方法作用是在主屏幕构建机器人对象。GraphicsEnvironment.isHeadless()此方法是测试当前服务器鼠标键盘是否支持GraphicsEnvironment.getLocalGraphicsEnvironment() .getDefaultScreenDevice(),其中GraphicsEnvironment.getLocalGraphicsEnvironment()为获取当前系统环境,getDefaultScreenDevice为获取默认屏幕设备

init方法为将此屏幕初始化进Robot对象中,iinit()方法详解见下文第3点

    public Robot() throws AWTException {
        if (GraphicsEnvironment.isHeadless()) {
            throw new AWTException("headless environment");
        }
        init(GraphicsEnvironment.getLocalGraphicsEnvironment()
            .getDefaultScreenDevice());
    }

2.Robot带参构造方法

此方法作用为给定屏幕创建机器人对象(注意此方法重点,实现钩子函数必须掌握,可在后台运行得点击脚本会依赖此方法)

checkIsScreenDevice:检查screen是否为屏幕设备

init方法为将此屏幕初始化进Robot对象中,init()方法详解见下文第3点

    public Robot(GraphicsDevice screen) throws AWTException {
        checkIsScreenDevice(screen);
        init(screen);
    }

3.init方法

初始化屏幕,将屏幕写入服务内存中

checkRobotAllowed:检查当前设备安全策略是否允许创建机器人

Toolkit toolkit = Toolkit.getDefaultToolkit();//获取默认工具箱,此方法加入synchronized标识,即为线程安全,判断Toolkit是否为ComponentFactory工具包

初始化RobotPeer

初始化机器人处理器RobotDisposer

sun.java2d.Disposer.addRecord(anchor, disposer);//将机器人处理器加入window系统处理器中,此代码含义是执行调用windows底层处理器

initLegalButtonMask:初始化鼠标按钮掩码,详见第4点

private void init(GraphicsDevice screen) throws AWTException {
        checkRobotAllowed();
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        if (toolkit instanceof ComponentFactory) {
            peer = ((ComponentFactory)toolkit).createRobot(this, screen);
            disposer = new RobotDisposer(peer);
            sun.java2d.Disposer.addRecord(anchor, disposer);
        }
        initLegalButtonMask();
    }

4.initLegalButtonMask

初始化合法的鼠标按钮掩码(所谓掩码即为ASCII码)。

判定按钮使用标识LEGAL_BUTTON_MASK,0为默认未使用,1为已使用
判定默认工具箱中是否允许处理和发布额外的鼠标按钮事件
获取鼠标按钮数
将鼠标按钮值做位或运算,并存入tmpMask中

    private static synchronized void initLegalButtonMask() {
        if (LEGAL_BUTTON_MASK != 0) return;
 
        int tmpMask = 0;
        if (Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled()){
            if (Toolkit.getDefaultToolkit() instanceof SunToolkit) {
                final int buttonsNumber = ((SunToolkit)(Toolkit.getDefaultToolkit())).getNumberOfButtons();
                for (int i = 0; i < buttonsNumber; i++){
                    tmpMask |= InputEvent.getMaskForButton(i+1);
                }
            }
        }
        tmpMask |= InputEvent.BUTTON1_MASK|
            InputEvent.BUTTON2_MASK|
            InputEvent.BUTTON3_MASK|
            InputEvent.BUTTON1_DOWN_MASK|
            InputEvent.BUTTON2_DOWN_MASK|
            InputEvent.BUTTON3_DOWN_MASK;
        LEGAL_BUTTON_MASK = tmpMask;
    }

5.checkRobotAllowed

判定当前设备的安全策略机制

获取当前系统安全管理器
检测安全管理器是否允许创建Robot机器人

private void checkRobotAllowed() {
        SecurityManager security = System.getSecurityManager();
        if (security != null) {
            security.checkPermission(SecurityConstants.AWT.CREATE_ROBOT_PERMISSION);
        }
    }

6.checkIsScreenDevice

检测屏幕设备。检测device是否是一个屏幕设备

    private void checkIsScreenDevice(GraphicsDevice device) {
        if (device == null || device.getType() != GraphicsDevice.TYPE_RASTER_SCREEN) {
            throw new IllegalArgumentException("not a valid screen device");
        }
    }

7.RobotDisposer

机器人处理器类

    static class RobotDisposer implements sun.java2d.DisposerRecord {
        private final RobotPeer peer;
        public RobotDisposer(RobotPeer peer) {
            this.peer = peer;
        }
        public void dispose() {
            if (peer != null) {
                peer.dispose();
            }
        }
    }

8.mouseMove

鼠标移动方法(线程安全),其中x,y为当前设备像素点

    public synchronized void mouseMove(int x, int y) {
        peer.mouseMove(x, y);
        afterEvent();
    }

9.mousePress

鼠标按下事件,传入的参数buttons,为鼠标哪一个键,其常用参数如下

InputEvent.BUTTON1_MASK:鼠标左键

InputEvent.BUTTON2_MASK:鼠标滚轮

InputEvent.BUTTON3_MASK:鼠标右键

    public synchronized void mousePress(int buttons) {
        checkButtonsArgument(buttons);
        peer.mousePress(buttons);
        afterEvent();
    }

10.checkNotDispatchThread

检测还未分派的线程,如果队里中存在,将抛出异常,Cannot call method from the event dispatcher thread(无法从事件调度程序线程调用方法)

    private void checkNotDispatchThread() {
        if (EventQueue.isDispatchThread()) {
            throw new IllegalThreadStateException("Cannot call method from the event dispatcher thread");
        }
    }
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐