基于java的鼠标键盘模拟操作常用方法汇总

十点数据 1年前 ⋅ 2662 阅读

最近在研究基于模拟器的,根据手机号微信自动添加好友的工具,其中涉及到了鼠标模拟点击、字符串输入等方法。同时,针对采集中可能需要截取验证码图片,整理了截图的功能。

具体代码如下所示:

package org.crawler;

import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;

public class Test {
	private static Robot robot;
	static {
		try {
			robot = new Robot();
			// 执行完一个事件后,再执行下一个
			robot.setAutoWaitForIdle(true);
		} catch (AWTException e) {
			e.printStackTrace();
		}
	}

	/***
	 * @date 2020年4月8日 下午11:52:22
	 *
	 * @Title: inputStr
	 *
	 * @Description: 输入字符串;
	 *
	 * @param str 带输入的字符串
	 *
	 * 
	 * @throws
	 */
	public static void inputStr(String str) {// 字符串
		robot.delay(1000);// 等待1秒
		Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
		clipboard.setContents(new StringSelection(str), null);
		robot.keyPress(KeyEvent.VK_CONTROL);
		robot.keyPress(KeyEvent.VK_V);
		robot.keyRelease(KeyEvent.VK_V);
		robot.keyRelease(KeyEvent.VK_CONTROL);
		System.out.println("输入字符串【" + str + "】完毕");
	}

	/***
	 * 鼠标移动到某个坐标点;
	 */
	public static void moveTo(int x, int y) {
		robot.delay(1000);// 等待1秒
		// 将鼠标指针移动到指定屏幕坐标
		robot.mouseMove(x, y);
		System.out.println("鼠标移动到【" + x + "," + y + "】坐标点完毕");
	}

	/***
	 * 
	 * 按下/释放一个或多个鼠标按钮, 参数说明:
	 * 
	 * buttons: 鼠标按钮掩码, 一个或多个以下标志的组合:
	 * 
	 * InputEvent.BUTTON1_MASK 鼠标左键
	 * 
	 * InputEvent.BUTTON2_MASK 鼠标中键
	 * 
	 * InputEvent.BUTTON3_MASK 鼠标右键
	 *
	 * @date 2020年4月9日 上午12:03:46

	 * 
	 * @throws
	 */
	public static void mousePress(int type) {
		robot.delay(1000);// 等待1秒
		if (type == 1)
			robot.mousePress(InputEvent.BUTTON1_MASK);// 鼠标左键
		if (type == 2)
			robot.mousePress(InputEvent.BUTTON2_MASK);// 鼠标中键
		if (type == 3)
			robot.mousePress(InputEvent.BUTTON3_MASK);// 鼠标右键
		System.out.println("【" + (type == 1 ? "按下鼠标左键" : type == 2 ? "按下鼠标中键" : "按下鼠标右键") + "】完毕");
	}

	/***
	 * 释放鼠标左键(按下后必须要释放, 一次点击操作包含:按下和释放)
	 * 
	 * @date 2020年4月9日 上午12:07:47
	 * 
	 * @throws
	 */
	public static void mouseRelease(int buttons) {
		robot.delay(1000);// 等待1秒
		if (buttons == 1)
			robot.mouseRelease(InputEvent.BUTTON1_MASK);// 鼠标左键
		if (buttons == 2)
			robot.mouseRelease(InputEvent.BUTTON2_MASK);// 鼠标中键
		if (buttons == 3)
			robot.mouseRelease(InputEvent.BUTTON3_MASK);// 鼠标右键
		System.out.println("【" + (buttons == 1 ? "松开鼠标左键" : buttons == 2 ? "松开鼠标中键" : "松开鼠标右键") + "】完毕");
	}

	/***
	 * 截屏;从X、Y坐标点,截取宽度为imageWidth,高为imageHeight的图像;
	 *
	 * @date 2020年4月9日 上午12:55:46
	 *
	 * @Title: snapShot
	 *
	 * @Description:截屏;
	 *
	 * @param imageFilePath 图片保存路径(全路径;);
	 * 
	 * @param X 截屏开始X轴坐标点;
	 * 
	 * @param Y 截屏开始Y轴坐标点;
	 * 
	 * @param imageWidth 从X坐标点开始的X轴长度;
	 * 
	 * @param imageHeight 从Y坐标点开始Y轴的高度;
	 *
	 * @return void 返回类型
	 * 
	 * @throws
	 */
	public static void snapShot(String imageFilePath, int X, int Y, int imageWidth, int imageHeight) {
		try { // 拷贝屏幕到一个BufferedImage对象screenshot
			BufferedImage screenshot = robot.createScreenCapture(new Rectangle(100, 100, 400, 100));
			File f = new File(imageFilePath);
			System.out.print("Save File  " + imageFilePath + ""); // 将screenshot对象写入图像文件
			ImageIO.write(screenshot, "png", f);
			System.out.print("......Finished!\n");
		} catch (Exception ex) {
			System.out.println(ex);
		}
	}
}

Python版本的模拟点击可以参考:通过Python,如何获取鼠标在屏幕上的X、Y轴坐标点

全部评论: 0

    我有话说: