如何利用java控制鼠標(biāo)操作一些重復(fù)的事情
場(chǎng)景
女朋友最近被安排了一個(gè)企業(yè)微信添加客戶的沙雕活,然后跟我吐槽說(shuō),每天都要加,都想離職了,為了不讓女朋友那么難受,突然想到可以使用Robot來(lái)幫女朋友完成添加人的傻瓜操作…
Robot的簡(jiǎn)單了解
Robot類用于為測(cè)試自動(dòng)化、自運(yùn)行演示程序和其他需要控制鼠標(biāo)和鍵盤的應(yīng)用程序生成本機(jī)系統(tǒng)輸入事件。Robot 的主要目的是便于 Java 平臺(tái)實(shí)現(xiàn)自動(dòng)測(cè)試。
Java中使用Robot類時(shí),需要導(dǎo)入java.awt包.
Robot類的幾個(gè)常見(jiàn)方法:
- delay(n)延遲電腦操作n毫秒,類似于Thread.sleep()
- keyPress()模擬手動(dòng)按下電腦鍵盤上的某個(gè)鍵
- keyRelease()模擬手動(dòng)松開(kāi)電腦鍵盤上的某個(gè)鍵(與keyPress()對(duì)應(yīng),按下一個(gè)鍵必須松開(kāi)這個(gè)鍵)
- mouseMove(x,y)將鼠標(biāo)移動(dòng)到指定的x,y位置
- mousePress()按下鼠標(biāo)上的某個(gè)鍵
- mouseRelease()松開(kāi)鼠標(biāo)上的某個(gè)鍵
鼠標(biāo)移動(dòng)需要知道位置
建一個(gè)main方法,循環(huán)定位鼠標(biāo)的位置信息,然后記錄一下.后續(xù)的位置都不能亂移動(dòng),要不然鼠標(biāo)位置就會(huì)錯(cuò)誤…
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è)微信添加好友
為了位置不會(huì)更改,我將企業(yè)微信擴(kuò)充到屏幕最大地方,添加好友的框框不可移動(dòng),圖片中標(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è)微信自動(dòng)加人,并返回用戶名
*/
public class WeChatRobot {
// 微信號(hào)旁邊的搜索圖標(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ā)送好友要請(qǐng)
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};
//查詢失敗,點(diǎn)擊確認(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("請(qǐng)將鼠標(biāo)放在企業(yè)微信添加朋友區(qū)域...");
robot.delay(6000);
File file = new File(filePath);
BufferedInputStream in = FileUtil.getInputStream(filePath);
// 讀取要添加的號(hào)碼
ArrayList<String> phones = IoUtil.readUtf8Lines(in, new ArrayList<>());
IoUtil.close(in);
// 過(guò)濾空格過(guò)后的號(hào)碼
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("要添加的手機(jī)號(hào):" + 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("開(kāi)始搜索微信名稱");
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ù)制的手機(jī)號(hào):" + lastName + "復(fù)制的微信名稱" + thisName);
if (Objects.equals(lastName, thisName)) {
System.out.println("查找失敗,點(diǎn)擊確認(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("一個(gè)任務(wù)完成..");
return;
}
weixinName.add(getClipboardString());
// 點(diǎn)擊邀請(qǐng)
// robot.mouseMove(add[0], add[1]);
// zuoji(robot);
// robot.delay(2000);
// 修改邀請(qǐng)的話
// robot.mouseMove(yaoqing[0], yaoqing[1]);
// zuoji(robot);
// zuoji(robot);
// zuoji(robot);
// robot.delay(1000);
// commandV(robot);
// 發(fā)送添加邀請(qǐng)
// robot.mouseMove(yaoqingadd[0], yaoqingadd[1]);
// zuoji(robot);
robot.delay(2000);
System.out.println("一個(gè)任務(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) {
//點(diǎn)擊鼠標(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;
}
}
因?yàn)橐苿?dòng)鼠標(biāo)有可能會(huì)有一些未知異常導(dǎo)致失敗,點(diǎn)擊也是,所以有時(shí)候我會(huì)點(diǎn)擊多次,移動(dòng)多次…
教女朋友用真是一件困難的事情,
上來(lái)就說(shuō)好了加吧,讓我?guī)退印缓笪蚁胫谌艘贼~不如授人以漁,然后讓她自己操作,結(jié)果又鬧大笑話…唉,
我看他沒(méi)保存文件,說(shuō)一下她,她怪我沒(méi)說(shuō)保存.


附更多實(shí)例教程
示例:截取指定矩形區(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ū)域自動(dòng)輸入指定字符
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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot 參數(shù)校驗(yàn)的具體實(shí)現(xiàn)方式
這篇文章主要介紹了Spring Boot 參數(shù)校驗(yàn)的具體實(shí)現(xiàn)方式,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-06-06
詳解springboot設(shè)置默認(rèn)參數(shù)Springboot.setDefaultProperties(map)不生效解決
這篇文章主要介紹了詳解springboot設(shè)置默認(rèn)參數(shù)Springboot.setDefaultProperties(map)不生效解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
mybatis的動(dòng)態(tài)SQL以及連接池詳解
這篇文章主要介紹了mybatis的動(dòng)態(tài)SQL以及連接池詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
java中的類型自動(dòng)轉(zhuǎn)換機(jī)制解析
這篇文章主要介紹了java中的類型自動(dòng)轉(zhuǎn)換機(jī)制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Spring?注入集合實(shí)現(xiàn)過(guò)程示例詳解
這篇文章主要為大家介紹了Spring?注入集合實(shí)現(xiàn)過(guò)程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
spring學(xué)習(xí)之util:properties的使用
這篇文章主要介紹了spring學(xué)習(xí)之util:properties的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
spring mvc實(shí)現(xiàn)文件上傳與下載功能
這篇文章主要為大家詳細(xì)介紹了spring mvc實(shí)現(xiàn)文件上傳與下載功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
Maven 搭建SpringMVC+Hibernate項(xiàng)目詳解
本文主要介紹Maven 搭建SpringMVC+Hibernate的知識(shí),這里整理了詳細(xì)的資料,并附示例代碼,有興趣的小伙伴可以參考下2016-09-09
java實(shí)現(xiàn)圖片寫入高清字體及帶邊框的方法
這篇文章主要介紹了java實(shí)現(xiàn)圖片寫入高清字體及帶邊框的方法,涉及java針對(duì)圖片及文字的相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07

