如何利用java控制鼠标操作一些重复的事情
时间:2022-11-29 09:53:01|栏目:JAVA代码|点击: 次
场景
女朋友最近被安排了一个企业微信添加客户的沙雕活,然后跟我吐槽说,每天都要加,都想离职了,为了不让女朋友那么难受,突然想到可以使用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);