robot类
介绍
类介绍
Robot类用于为测试自动化、自运行演示程序和其他需要控制鼠标和键盘的应用程序生成本机系统输入事件。Robot 的主要目的是便于 Java 平台实现自动测试。
该类位于 java.awt.Robot
使用场景
一些机械化脚本
类方法
构造方法
Robot() //在主屏幕的坐标系中构造机器人对象
Robot(GraphicsDevice screen) // 为给定的屏幕设备创建一个机器人。传递给机器人方法
//调用(如mouseMove,getPixelColor和createScreenCapture)的坐标将被解释为与指
//定屏幕位于同一坐标系中。请注意,根据平台配置,多个屏幕可能:
//共享相同的坐标系以形成组合的虚拟屏幕
//使用不同的坐标系充当独立的屏幕
//如果重新配置屏幕设备以影响坐标系,则未定义现有机器人对象的行为。
鼠标
void mouseMove(int x, int y) //将鼠标指针移动到给定的屏幕坐标
void mousePress(int buttons) //按下一个或多个鼠标按钮。
void mouseRelease(int buttons) // 释放一个或多个鼠标按钮。
void mouseWheel(int wheelAmt) // 在配备滚轮的鼠标上旋转滚轮
mousePress
按键参数通过mouseEvent或者inputEvent中枚举表示。
按下后记得松开
mouseWheel参数说明
移动鼠标滚轮的“凹口”数量负值表示向上/远离用户,正值表示向下/朝向用户移动。
键盘
void keyPress(int keycode) // 按下keycode
void keyRelease(int keycode) // 松开keycode
keyPress(int keycode)说明
按下keycode按键
实现同时按下就按顺序写不松开就行。
注意:实现游戏脚本的时候,想要随机时间来按键和松开比较好,不然的话,容易被检测出来。
按键可以通过KeyEvent的枚举来表示
屏幕
Color getPixelColor(int x, int y) // 获取指定像素点的颜色
BufferedImage createScreenCapture(Rectangle screenRect)
MultiResolutionImage createMultiResolutionScreenCapture(Rectangle screenRect)
getPixelColor注意
获取x,y像素点的颜色,不过因为很多电脑又缩放,所以一般会需要转换一下
实例
抖音
这个例子用于实现,抖音进度条到最后后自动下一个视频,不过呢,我试了一下不是特别实用,因为进度条的颜色会因为视频的颜色原因有所变化,不是一模一样的。这里这是作为我的一个练习。
这里想要获取坐标和颜色rgb我用的是powertoys这个工具箱完成的
public void douyin(){
try {
Robot r = new Robot();
while (true){
Color color = r.getPixelColor(getW(1450), getW(967)); // 获取进度条最后位置的颜色
// r.mouseMove(getW(1450), getW(967)); 测试移动点
if (color.getRGB() > -7500000 && color.getRGB() < -6800000) {// 颜色如果为已加载颜色则下一个视频
r.mouseWheel(100);// 鼠标下滑
demo(color);// 打印颜色
}
r.delay(2000);// 每2s监视一次
}
} catch (AWTException e) {
throw new RuntimeException(e);
}
}
//打印颜色
private static void demo(Color c) {
System.out.println(c.getRGB());
System.out.println(c.getRed());
System.out.println(c.getGreen());
System.out.println(c.getBlue());
}
// 因为我的电脑有着125%的缩放,所以想要改回去
public static int getW(int x){
return (int) (x/1.25);
}
封装工具类
输出字符串
我没有寻找到java能够向光标位置输出的方法,这里借助粘贴板完成
这里代码借助了后面按下多个按钮的工具类
public static void keyPressString(Robot r ,String str){
//获取剪切板
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
//将传入字符串封装下
Transferable tText = new StringSelection(str);
//将字符串放入剪切板
clip.setContents(tText, null);
//按下Ctrl+V实现粘贴文本
keyPressN(r,KeyEvent.VK_CONTROL,KeyEvent.VK_V);
r.delay(100);
}
一下按下去一个键
public static void keyPressOne(Robot r,int keyCode){
r.keyPress(keyCode);
r.keyRelease(keyCode);
r.delay(100);
}
按下去多个键
public static void keyPressN(Robot r,int... keyCode){
for (int i : keyCode) {
r.keyPress(i);
}
for (int i : keyCode) {
r.keyRelease(i);
}
}