Java robot详解
简介:此类用于生成本机系统输入事件,出于测试自动化、自运行演示和其他可以控制鼠标和键盘的应用程序这是需要的。机器人的主要目的是方便用户Java平台实现的自动化测试方法介绍及解析:以下private开头方法为Robot内部使用,方法,public方法为对外开放方法,请重点关注public方法。
文章目录
简介:此类用于生成本机系统输入事件,出于测试自动化、自运行演示和其他可以控制鼠标和键盘的应用程序这是需要的。机器人的主要目的是方便用户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");
}
}
更多推荐
所有评论(0)