如何利用java控制鼠標(biāo)操作一些重復(fù)的事情
場景
女朋友最近被安排了一個企業(yè)微信添加客戶的沙雕活,然后跟我吐槽說,每天都要加,都想離職了,為了不讓女朋友那么難受,突然想到可以使用Robot來幫女朋友完成添加人的傻瓜操作…
Robot的簡單了解
Robot類用于為測試自動化、自運行演示程序和其他需要控制鼠標(biāo)和鍵盤的應(yīng)用程序生成本機系統(tǒng)輸入事件。Robot 的主要目的是便于 Java 平臺實現(xiàn)自動測試。
Java中使用Robot類時,需要導(dǎo)入java.awt包.
Robot類的幾個常見方法:
- delay(n)延遲電腦操作n毫秒,類似于Thread.sleep()
- keyPress()模擬手動按下電腦鍵盤上的某個鍵
- keyRelease()模擬手動松開電腦鍵盤上的某個鍵(與keyPress()對應(yīng),按下一個鍵必須松開這個鍵)
- mouseMove(x,y)將鼠標(biāo)移動到指定的x,y位置
- mousePress()按下鼠標(biāo)上的某個鍵
- mouseRelease()松開鼠標(biāo)上的某個鍵
鼠標(biāo)移動需要知道位置
建一個main方法,循環(huán)定位鼠標(biāo)的位置信息,然后記錄一下.后續(xù)的位置都不能亂移動,要不然鼠標(biāo)位置就會錯誤…
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("當(dāng)前坐標(biāo):" + p.x + "," + p.y);
TimeUnit.SECONDS.sleep(3);
}
}
企業(yè)微信添加好友
為了位置不會更改,我將企業(yè)微信擴充到屏幕最大地方,添加好友的框框不可移動,圖片中標(biāo)注的位置就是記錄的位置:

然后循環(huán)的操作就是加好友等操作,我直接貼出代碼:
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;
/**
* 企業(yè)微信自動加人,并返回用戶名
*/
public class WeChatRobot {
// 微信號旁邊的搜索圖標(biāo)
private static int[] search = new int[]{565, 324};
// 添加好友按鈕
private static int[] add = new int[]{841, 442};
// private static int[] yaoqing = new int[]{588, 433};
// 發(fā)送好友要請
private static int[] yaoqingadd = new int[]{716, 489};
// 微信圖標(biāo)
private static int[] searchweixin = new int[]{579, 439};
// 微信名稱位置
private static int[] weixinname = new int[]{597, 585};
//查詢失敗,點擊確認(rèn)的位置
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("請將鼠標(biāo)放在企業(yè)微信添加朋友區(qū)域...");
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());
// 記錄的企業(yè)微信名稱
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("鼠標(biāo)當(dāng)前在微信區(qū)域...");
zuoji(robot);
robot.mouseMove(weixinname[0], weixinname[1]);
System.out.println("鼠標(biāo)當(dāng)前在微信名稱區(qū)域...");
robot.delay(500);
// youji(robot);
zuoji(robot);
robot.delay(500);
String lastName = getClipboardString();
// 全選
commandA(robot);
robot.delay(500);
// 按下了command+c,完成復(fù)制功能
commandC(robot);
robot.delay(500);
String thisName = getClipboardString();
System.out.println("復(fù)制的手機號:" + lastName + "復(fù)制的微信名稱" + thisName);
if (Objects.equals(lastName, thisName)) {
System.out.println("查找失敗,點擊確認(rèn)");
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("一個任務(wù)完成..");
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);
// 發(fā)送添加邀請
// robot.mouseMove(yaoqingadd[0], yaoqingadd[1]);
// zuoji(robot);
robot.delay(2000);
System.out.println("一個任務(wù)完成..");
}
//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) {
//點擊鼠標(biāo)
//鼠標(biāo)左鍵
System.out.println("單擊");
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
}
private static void youji(Robot robot) {
//鼠標(biāo)右鍵
System.out.println("右擊");
robot.mousePress(InputEvent.BUTTON3_MASK);
robot.mouseRelease(InputEvent.BUTTON3_MASK);
}
/**
* 把文本設(shè)置到剪貼板(復(fù)制)
*/
public static void setClipboardString(String text) {
// 獲取系統(tǒng)剪貼板
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
// 封裝文本內(nèi)容
Transferable trans = new StringSelection(text);
// 把文本內(nèi)容設(shè)置到系統(tǒng)剪貼板
clipboard.setContents(trans, null);
}
/**
* 從剪貼板中獲取文本(粘貼)
*/
public static String getClipboardString() {
// 獲取系統(tǒng)剪貼板
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
// 獲取剪貼板中的內(nèi)容
Transferable trans = clipboard.getContents(null);
if (trans != null) {
// 判斷剪貼板中的內(nèi)容是否支持文本
if (trans.isDataFlavorSupported(DataFlavor.stringFlavor)) {
try {
// 獲取剪貼板中的文本內(nèi)容
String text = (String) trans.getTransferData(DataFlavor.stringFlavor);
return text;
} catch (Exception e) {
e.printStackTrace();
}
}
}
return StringUtils.EMPTY;
}
}
因為移動鼠標(biāo)有可能會有一些未知異常導(dǎo)致失敗,點擊也是,所以有時候我會點擊多次,移動多次…
教女朋友用真是一件困難的事情,
上來就說好了加吧,讓我?guī)退印缓笪蚁胫谌艘贼~不如授人以漁,然后讓她自己操作,結(jié)果又鬧大笑話…唉,
我看他沒保存文件,說一下她,她怪我沒說保存.


附更多實例教程
示例:截取指定矩形區(qū)域的圖像,并保存到指定的路徑
public static void main(String[] args) throws AWTException, IOException {
Robot robot=new Robot();
//獲取指定矩形區(qū)域的屏幕圖像
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);
}
示例:在指定區(qū)域自動輸入指定字符
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);
總結(jié)
到此這篇關(guān)于如何利用java控制鼠標(biāo)操作一些重復(fù)的事情的文章就介紹到這了,更多相關(guān)java控制鼠標(biāo)操作重復(fù)事情內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot 參數(shù)校驗的具體實現(xiàn)方式
這篇文章主要介紹了Spring Boot 參數(shù)校驗的具體實現(xiàn)方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-06-06
詳解springboot設(shè)置默認(rèn)參數(shù)Springboot.setDefaultProperties(map)不生效解決
這篇文章主要介紹了詳解springboot設(shè)置默認(rèn)參數(shù)Springboot.setDefaultProperties(map)不生效解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
spring學(xué)習(xí)之util:properties的使用
這篇文章主要介紹了spring學(xué)習(xí)之util:properties的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
Maven 搭建SpringMVC+Hibernate項目詳解
本文主要介紹Maven 搭建SpringMVC+Hibernate的知識,這里整理了詳細(xì)的資料,并附示例代碼,有興趣的小伙伴可以參考下2016-09-09

