疫情期间很多公司开始远程办公,但是远程办公后如何获取员工的活跃度(看看是不是在划水),
很多公司已经开始使用云操作系统,或者安装了一些安全监控软件,可能会检测鼠标、键盘等等的活跃度,
这时我们该如何合理的工作(摸鱼),又不被检测出来活跃度不够呢?
当然你可以使用鼠标精灵等软件,本文介绍一种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) | 滚动鼠标滑轮 |
了解了常用方法后,就能够快速想到用这些方法实现自动写代码功能
下面简单模拟实现控制台打印
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);
}
最终效果:
以上只是简单模拟了键盘写代码操作,更多用途可以自己发掘
其实画图也就是用画图中的工具,然后模拟鼠标拖拽动作,主要分为如下几步
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输出双引号“”,你可以试试
使用go语言的同学可以看下这个开源库,实现的是一样的功能: https://github.com/go-vgo/robotgo