Java隐藏技-自动化机器人

606 阅读4分钟

这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战

骚操作

疫情期间很多公司开始远程办公,但是远程办公后如何获取员工的活跃度(看看是不是在划水),

很多公司已经开始使用云操作系统,或者安装了一些安全监控软件,可能会检测鼠标、键盘等等的活跃度,

这事,我们该如何合理的工作(摸鱼),又不被检测出来活跃度不够呢?

当然你可以使用鼠标精灵等软件,本文介绍一种Java的实现方案。

简介

Robot类用于模拟鼠标、键盘事件,生成本机系统输入事件。

Robot 的主要用于自动化、自运行的程序和其他需要自动控制鼠标和键盘的程序

相当于实际操作的效果,不仅仅只是生成对应的鼠标、键盘事件。 比如Robot.mouseMove() 将实际移动鼠标光标,而不是只生成鼠标移动事件。

实现的是本机的全局模拟,不仅仅局限于写的程序和IDE

常用方法

方法含义
void delay (int ms)睡眠指定的时间(类似于线程中sleep)
void keyPress(int keycode)按下指定的键
void keyRelease(int keycode)释放指定的键
void mousePress(int buttons)按下一个或多个鼠标按键
void mouseRelease(int buttons)释放一个活多个鼠标按键
void mouseMove(int x,int y)将鼠标移动到给定的屏幕坐标上
void mouseWheel(int wheelAmt)滚动鼠标滑轮

小栗子

1、自动编码

了解了常用方法后,就能够快速想到用这些方法实现自动写代码功能

下面简单模拟实现控制台打印

  • 调用IDEA输出快捷键sout
  • 回车后实现完整输出System.out.println();
  • 在输出位置写入2-1
public static void main(String[] args) throws AWTException {
    Robot robot = new Robot();
    robot.keyPress(KeyEvent.VK_S);
    robot.keyRelease(KeyEvent.VK_S);
    robot.keyPress(KeyEvent.VK_O);
    robot.keyRelease(KeyEvent.VK_O);
    robot.keyPress(KeyEvent.VK_U);
    robot.keyRelease(KeyEvent.VK_U);
    robot.delay(100);
    robot.keyPress(KeyEvent.VK_T);
    robot.keyRelease(KeyEvent.VK_T);
    robot.delay(500);
    robot.keyPress(KeyEvent.VK_ENTER);
    robot.keyRelease(KeyEvent.VK_ENTER);
    robot.delay(500);
    robot.keyPress(KeyEvent.VK_2);
    robot.keyRelease(KeyEvent.VK_2);
    robot.delay(500);
    robot.keyPress(KeyEvent.VK_MINUS);
    robot.keyRelease(KeyEvent.VK_MINUS);
    robot.delay(500);
    robot.keyPress(KeyEvent.VK_1);
    robot.keyRelease(KeyEvent.VK_1);
}

最终效果:

2、画图

其实画图也就是用画图中的工具,然后模拟鼠标拖拽动作,主要分为如下几步

  • 打开画图软件
  • 选中椭圆
  • 运行程序
public static void main(String[] args) throws AWTException {
    Robot robot = new Robot(); 
    robot.delay(5000);//等待5秒 5秒后必须打开画图板选中椭圆才可正常运行
   //第一个圆
    int i = 10;
    while (i-- > 0) {
        robot.mouseMove(400, 300);
    }
    robot.mousePress(InputEvent.BUTTON1_MASK);
    robot.delay(100);
    i = 10;
    while (i-- > 0) {
        robot.mouseMove(650, 550);
    }
    robot.mouseRelease(InputEvent.BUTTON1_MASK);
    robot.delay(1000);       //画完一个圆停止0.2s,否则因为计算机执行速度太快,看不到动态作图的过程
    //第二个圆
    i = 10;
    while (i-- > 0) {
        robot.mouseMove(0, 300);
    }
    robot.mousePress(InputEvent.BUTTON1_MASK);
    robot.mouseRelease(InputEvent.BUTTON1_MASK); //画完一个圆后在圆外面点一下鼠标,否则回拖动画的圆到下一个位置
    i = 10;
    while (i-- > 0) {
        robot.mouseMove(600, 300);
    }
    robot.mousePress(InputEvent.BUTTON1_MASK);
    robot.delay(100);       //这里延迟0.1s,可以看到动态画的过程
    i = 10;
    while (i-- > 0) {
        robot.mouseMove(850, 550);
    }
    robot.mouseRelease(InputEvent.BUTTON1_MASK);
    robot.delay(1000);       //画完一个圆停止0.2s,否则因为计算机执行速度太快,看不到动态作图的过程

    //第三个圆
    i = 10;
    while (i-- > 0) {
        robot.mouseMove(0, 300);
    }
    robot.mousePress(InputEvent.BUTTON1_MASK);
    robot.mouseRelease(InputEvent.BUTTON1_MASK); //画完一个圆后在圆外面点一下鼠标,否则回拖动画的圆到下一个位置
    i = 10;
    while (i-- > 0) {
        robot.mouseMove(800, 300);
    }
    robot.mousePress(InputEvent.BUTTON1_MASK);
    robot.delay(100);       //这里延迟0.2s,可以看到动态画的过程
    i = 10;
    while (i-- > 0) {
        robot.mouseMove(1050, 550);
    }
    robot.mouseRelease(InputEvent.BUTTON1_MASK);
    robot.delay(200);       //画完一个圆停止0.1s,否则因为计算机执行速度太快,看不到动态作图的过程

    //第四个圆
    i = 10;
    while (i-- > 0) {
        robot.mouseMove(0, 300);
    }
    robot.mousePress(InputEvent.BUTTON1_MASK);
    robot.mouseRelease(InputEvent.BUTTON1_MASK); //画完一个圆后在圆外面点一下鼠标,否则回拖动画的圆到下一个位置
    i = 10;
    while (i-- > 0) {
        robot.mouseMove(500, 425);
    }
    robot.mousePress(InputEvent.BUTTON1_MASK);
    robot.delay(100);       //这里延迟0.1s,可以看到动态画的过程
    i = 10;
    while (i-- > 0) {
        robot.mouseMove(750, 675);
    }
    robot.mouseRelease(InputEvent.BUTTON1_MASK);
    robot.delay(200);       //画完一个圆停止0.2s,否则因为计算机执行速度太快,看不到动态作图的过程

    //第五个圆
    i = 10;
    while (i-- > 0) {
        robot.mouseMove(0, 300);
    }
    robot.mousePress(InputEvent.BUTTON1_MASK);
    robot.mouseRelease(InputEvent.BUTTON1_MASK); //画完一个圆后在圆外面点一下鼠标,否则回拖动画的圆到下一个位置
    i = 10;
    while (i-- > 0) {
        robot.mouseMove(700, 425);
    }
    robot.mousePress(InputEvent.BUTTON1_MASK);
    robot.delay(100);       //这里延迟0.1s,可以看到动态画的过程
    i = 10;
    while (i-- > 0) {
        robot.mouseMove(950, 675);
    }
    robot.mouseRelease(InputEvent.BUTTON1_MASK);
    robot.delay(200);       //画完一个圆停止0.2s,否则因为计算机执行速度太快,看不到动态作图的过程
}

最终效果:

小结

Java中Robot类不是很常用,却是很有用的一个类,能实现一些很有意思的功能,看了上面栗子你可能会问为什么不模拟输出"Hello word"呢,这是因为我不会用KeyEvent输出双引号“”,你可以试试,如果可以评论@我。