如何利用java控制鼠標(biāo)操作一些重復(fù)的事情
場景
女朋友最近被安排了一個(gè)企業(yè)微信添加客戶的沙雕活,然后跟我吐槽說,每天都要加,都想離職了,為了不讓女朋友那么難受,突然想到可以使用Robot來幫女朋友完成添加人的傻瓜操作…
Robot的簡單了解
Robot類用于為測試自動化、自運(yùn)行演示程序和其他需要控制鼠標(biāo)和鍵盤的應(yīng)用程序生成本機(jī)系統(tǒng)輸入事件。Robot 的主要目的是便于 Java 平臺實(shí)現(xiàn)自動測試。
Java中使用Robot類時(shí),需要導(dǎo)入java.awt包.
Robot類的幾個(gè)常見方法:
- delay(n)延遲電腦操作n毫秒,類似于Thread.sleep()
- keyPress()模擬手動按下電腦鍵盤上的某個(gè)鍵
- keyRelease()模擬手動松開電腦鍵盤上的某個(gè)鍵(與keyPress()對應(yīng),按下一個(gè)鍵必須松開這個(gè)鍵)
- mouseMove(x,y)將鼠標(biāo)移動到指定的x,y位置
- mousePress()按下鼠標(biāo)上的某個(gè)鍵
- mouseRelease()松開鼠標(biāo)上的某個(gè)鍵
鼠標(biāo)移動需要知道位置
建一個(gè)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è)微信擴(kuò)充到屏幕最大地方,添加好友的框框不可移動,圖片中標(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}; //查詢失敗,點(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("請將鼠標(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("要添加的手機(jī)號:" + 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ù)制的手機(jī)號:" + 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)擊邀請 // 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("一個(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)橐苿邮髽?biāo)有可能會有一些未知異常導(dǎo)致失敗,點(diǎn)擊也是,所以有時(shí)候我會點(diǎn)擊多次,移動多次…
教女朋友用真是一件困難的事情,
上來就說好了加吧,讓我?guī)退印缓笪蚁胫谌艘贼~不如授人以漁,然后讓她自己操作,結(jié)果又鬧大笑話…唉,
我看他沒保存文件,說一下她,她怪我沒說保存.
附更多實(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ū)域自動輸入指定字符
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)文章
關(guān)于TransmittableThreadLocal線程池中線程復(fù)用問題的解決方案
這篇文章主要介紹了關(guān)于TransmittableThreadLocal線程池中線程復(fù)用問題的解決方案,線程池復(fù)用線程,如果子線程執(zhí)行完未移除上下文,則會導(dǎo)致后續(xù)線程可以取到之前線程設(shè)置的屬性,需要的朋友可以參考下2023-11-11spring boot jpa寫原生sql報(bào)Cannot resolve table錯誤解決方法
在本篇文章里小編給大家整理的是關(guān)于spring boot jpa寫原生sql報(bào)Cannot resolve table錯誤的解決方法,需要的朋友學(xué)習(xí)下。2019-11-11Java分布式鎖理論(redis、zookeeper))案例詳解
zookeeper有個(gè)節(jié)點(diǎn)路徑的概念,節(jié)點(diǎn)路徑不能重復(fù),保證了唯一性,這篇文章給大家介紹Java分布式鎖理論(redis、zookeeper)?案例詳解,感興趣的朋友跟隨小編一起看看吧2024-01-01MybatisPlus?自定義插件實(shí)現(xiàn)攔截SQL修改功能(實(shí)例詳解)
這篇文章主要介紹了MybatisPlus?自定義插件實(shí)現(xiàn)攔截SQL修改功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11Mybatis實(shí)體類屬性與數(shù)據(jù)庫不一致解決方案
這篇文章主要介紹了Mybatis實(shí)體類屬性與數(shù)據(jù)庫不一致解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10