如何利用java控制鼠标操作一些重复的事情
作者:你就像甜甜的益达 发布时间:2021-11-12 12:54:02
场景
女朋友最近被安排了一个企业微信添加客户的沙雕活,然后跟我吐槽说,每天都要加,都想离职了,为了不让女朋友那么难受,突然想到可以使用Robot来帮女朋友完成添加人的傻瓜操作…
Robot的简单了解
Robot类用于为测试自动化、自运行演示程序和其他需要控制鼠标和键盘的应用程序生成本机系统输入事件。Robot 的主要目的是便于 Java 平台实现自动测试。
Java中使用Robot类时,需要导入java.awt包.
Robot类的几个常见方法:
delay(n)延迟电脑操作n毫秒,类似于Thread.sleep()
keyPress()模拟手动按下电脑键盘上的某个键
keyRelease()模拟手动松开电脑键盘上的某个键(与keyPress()对应,按下一个键必须松开这个键)
mouseMove(x,y)将鼠标移动到指定的x,y位置
mousePress()按下鼠标上的某个键
mouseRelease()松开鼠标上的某个键
鼠标移动需要知道位置
建一个main方法,循环定位鼠标的位置信息,然后记录一下.后续的位置都不能乱移动,要不然鼠标位置就会错误…
public static void main(String[] args) throws InterruptedException {
while (true) {
PointerInfo pinfo = MouseInfo.getPointerInfo();
int numberOfButtons = MouseInfo.getNumberOfButtons();
System.out.println(numberOfButtons);
Point p = pinfo.getLocation();
System.out.println("当前坐标:" + p.x + "," + p.y);
TimeUnit.SECONDS.sleep(3);
}
}
企业微信添加好友
为了位置不会更改,我将企业微信扩充到屏幕最大地方,添加好友的框框不可移动,图片中标注的位置就是记录的位置:
然后循环的操作就是加好友等操作,我直接贴出代码:
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.file.FileAppender;
import com.google.common.collect.Lists;
import org.apache.commons.lang3.StringUtils;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.io.BufferedInputStream;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* 企业微信自动加人,并返回用户名
*/
public class WeChatRobot {
// 微信号旁边的搜索图标
private static int[] search = new int[]{565, 324};
// 添加好友按钮
private static int[] add = new int[]{841, 442};
// private static int[] yaoqing = new int[]{588, 433};
// 发送好友要请
private static int[] yaoqingadd = new int[]{716, 489};
// 微信图标
private static int[] searchweixin = new int[]{579, 439};
// 微信名称位置
private static int[] weixinname = new int[]{597, 585};
//查询失败,点击确认的位置
private static int[] errorName = new int[]{859, 461};
// 要查询的电话文件路径
private static final String filePath = "/Users/src/main/resources/aaa";
public static void main(String[] args) throws AWTException {
Robot robot = new Robot();
System.out.println("请将鼠标放在企业微信添加朋友区域...");
robot.delay(6000);
File file = new File(filePath);
BufferedInputStream in = FileUtil.getInputStream(filePath);
// 读取要添加的号码
ArrayList<String> phones = IoUtil.readUtf8Lines(in, new ArrayList<>());
IoUtil.close(in);
// 过滤空格过后的号码
List<String> phoneList = phones.stream().filter(StringUtils::isNotBlank).collect(Collectors.toList());
// 记录的企业微信名称
ArrayList<String> weixinName = Lists.newArrayList();
for (int j = 0; j <= phoneList.size() - 1; j++) {
String sentencet = phoneList.get(j);
System.out.println("要添加的手机号:" + sentencet);
setClipboardString(sentencet);
doAdd(robot, weixinName);
}
// 将微信名称追加到后面
FileAppender appender = new FileAppender(file, 16, true);
weixinName.forEach(x -> {
appender.append(x);
});
appender.flush();
}
private static void doAdd(Robot robot, ArrayList<String> weixinName) {
robot.mouseMove(search[0], search[1]);
robot.delay(3000);
zuoji(robot);
robot.delay(500);
robot.mouseMove(search[0], search[1]);
zuoji(robot);
robot.delay(3000);
// 按下了command+v,完成粘贴功能
commandV(robot);
robot.delay(500);
robot.mouseMove(search[0], search[1]);
robot.delay(500);
robot.keyPress(KeyEvent.VK_ENTER);
System.out.println("开始搜索微信名称");
robot.delay(5000);
robot.mouseMove(searchweixin[0], searchweixin[1]);
System.out.println("鼠标当前在微信区域...");
zuoji(robot);
robot.mouseMove(weixinname[0], weixinname[1]);
System.out.println("鼠标当前在微信名称区域...");
robot.delay(500);
// youji(robot);
zuoji(robot);
robot.delay(500);
String lastName = getClipboardString();
// 全选
commandA(robot);
robot.delay(500);
// 按下了command+c,完成复制功能
commandC(robot);
robot.delay(500);
String thisName = getClipboardString();
System.out.println("复制的手机号:" + lastName + "复制的微信名称" + thisName);
if (Objects.equals(lastName, thisName)) {
System.out.println("查找失败,点击确认");
robot.mouseMove(errorName[0], errorName[1]);
zuoji(robot);
robot.delay(1000);
robot.mouseMove(errorName[0], errorName[1]);
zuoji(robot);
weixinName.add("查找失败-" + thisName);
robot.delay(2000);
System.out.println("一个任务完成..");
return;
}
weixinName.add(getClipboardString());
// 点击邀请
// robot.mouseMove(add[0], add[1]);
// zuoji(robot);
// robot.delay(2000);
// 修改邀请的话
// robot.mouseMove(yaoqing[0], yaoqing[1]);
// zuoji(robot);
// zuoji(robot);
// zuoji(robot);
// robot.delay(1000);
// commandV(robot);
// 发送添加邀请
// robot.mouseMove(yaoqingadd[0], yaoqingadd[1]);
// zuoji(robot);
robot.delay(2000);
System.out.println("一个任务完成..");
}
//VK_META是mac的command按键
private static void commandA(Robot robot) {
robot.keyPress(KeyEvent.VK_META);
robot.keyPress(KeyEvent.VK_A);
robot.keyRelease(KeyEvent.VK_META);
robot.keyRelease(KeyEvent.VK_A);
}
private static void commandC(Robot robot) {
robot.keyPress(KeyEvent.VK_META);
robot.keyPress(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_META);
robot.keyRelease(KeyEvent.VK_C);
}
private static void commandV(Robot robot) {
robot.keyPress(KeyEvent.VK_META);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_META);
robot.keyRelease(KeyEvent.VK_V);
}
private static void zuoji(Robot robot) {
//点击鼠标
//鼠标左键
System.out.println("单击");
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
}
private static void youji(Robot robot) {
//鼠标右键
System.out.println("右击");
robot.mousePress(InputEvent.BUTTON3_MASK);
robot.mouseRelease(InputEvent.BUTTON3_MASK);
}
/**
* 把文本设置到剪贴板(复制)
*/
public static void setClipboardString(String text) {
// 获取系统剪贴板
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
// 封装文本内容
Transferable trans = new StringSelection(text);
// 把文本内容设置到系统剪贴板
clipboard.setContents(trans, null);
}
/**
* 从剪贴板中获取文本(粘贴)
*/
public static String getClipboardString() {
// 获取系统剪贴板
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
// 获取剪贴板中的内容
Transferable trans = clipboard.getContents(null);
if (trans != null) {
// 判断剪贴板中的内容是否支持文本
if (trans.isDataFlavorSupported(DataFlavor.stringFlavor)) {
try {
// 获取剪贴板中的文本内容
String text = (String) trans.getTransferData(DataFlavor.stringFlavor);
return text;
} catch (Exception e) {
e.printStackTrace();
}
}
}
return StringUtils.EMPTY;
}
}
因为移动鼠标有可能会有一些未知异常导致失败,点击也是,所以有时候我会点击多次,移动多次…
教女朋友用真是一件困难的事情,
上来就说好了加吧,让我帮她加…然后我想着授人以鱼不如授人以渔,然后让她自己操作,结果又闹大笑话…唉,
我看他没保存文件,说一下她,她怪我没说保存.
附更多实例教程
示例:截取指定矩形区域的图像,并保存到指定的路径
public static void main(String[] args) throws AWTException, IOException {
Robot robot=new Robot();
//获取指定矩形区域的屏幕图像
BufferedImage bufferedImage=robot.createScreenCapture(new Rectangle(100,100,500,500));
File f=new File("D:\\save.jpg");
OutputStream os=new FileOutputStream(f);
ImageIO.write(bufferedImage, "jpg", os);
}
示例:在指定区域自动输入指定字符
robot.mouseMove(342, 626);
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
robot.delay(500);
robot.keyPress(KeyEvent.VK_L);
robot.keyRelease(KeyEvent.VK_L);
robot.delay(500);
robot.keyPress(KeyEvent.VK_O);
robot.keyRelease(KeyEvent.VK_O);
robot.delay(500);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_V);
robot.delay(500);
robot.keyPress(KeyEvent.VK_E);
robot.keyRelease(KeyEvent.VK_E);
robot.delay(500);
来源:https://blog.csdn.net/qq_38366063/article/details/122081252


猜你喜欢
- 今天记录一下TextView的倒影效果,显示一串文字,然后在文字的下方显示出它的倒影,先上效果图:最重要的就是View中getDrawing
- 由于MediaPlayer占用资源较多,且不支持同时播放多个音频,所以Android还提供了另一个播放音频的类-----SoundPool。
- 上次给一个网站写网站 前后端分离 最后跪在ajax跨域上面了 自己在网上找了个方法 亲试可用
- 一、简介在上篇 ElasticSearch 文章中,我们详细的介绍了 ElasticSearch 的各种 api 使用。实际的项目开发过程中
- 在java中读取读取文件,经常因为路径的问题找不到,此文用于记录如何定位文件的简单方法。本基于springboot做的测试,主要是构建工程方
- 今天学习到了SpringBoot 的属性赋值@Value用法先总结@Value(" 张三 "):直接附在属性名上,在Be
- 本文实例为大家分享了安装和配置maven环境的具体步骤,供大家参考,具体内容如下下载maven:1.进入官网下载:http://maven.
- pom.xml与settings.xmlpom.xml与setting.xml,可以说是Maven中最重要的两个配置文件,决定了Maven的
- 本文实例为大家分享了android短信管理器SmsManager的具体代码,供大家参考,具体内容如下需要注册的权限<uses-perm
- 废话不多说,咱们第一篇文章就是模仿“知乎”的回答详情页的动画效果,先上个原版的效果图,咱们就是要做出这个效果 &nbs
- 一 引入考虑实现一种三轴机器人控件。三轴机器人用来将某种工件从一个位置运送到另一个位置。其X轴为手臂轴,可以正向和反向运动,它处于末端,直接
- Android ListView与ScrollView冲突的解决方法总结众所周知ListView与ScrollView都具有滚动能力,对于这
- 1,pair的应用pair是将2个数据组合成一组数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一
- 前两天给同事做 code review,感觉自己对 Java 的 Generics 掌握得不够好,便拿出 《Effective Java》1
- FastDFS简介FastDFS是一款开源的轻量级分布式文件系统,使用C实现,支持Linux、BSD等unix-like操作系统。值得注意的
- 最近一直在看RecyclerView,较之ListView它确实是灵活多变,给予开发者更多自定义的空间,比如:需要添加头部和尾部、item的
- 最近需要用到微信的标签功能(如下图所示)。该功能可以添加已有标签,也可以自定义标签。也可以删除已编辑菜单。研究了一番。发现还是挺
- java实现读取、删除文件夹下的文件package test.com;import java.io.File;import java.io.
- 这篇文章主要介绍了Java数据封装树形结构代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- RocketMQ发送消息我们在使用RocketMQ发送消息时,一般都会使用DefaultMQProducer,类型的代码如下:Default