网站建设情况自查报告,六安市论坛,成都广告公司排行榜,酒类网站建设方案目录 一、引言
二、代码实现
1. 新增工具类 CoordinateExtractUtil
1.1 核心方法说明
2. DesktopRobotUtil 修改
2.1 功能概述
2.2 核心方法解析
鼠标操作
键盘操作
滚轮操作
注意事项
3. OperationController 接口
三、结果演示 一、引言 在前文 基于GUI-PLUS 的桌…目录一、引言二、代码实现1. 新增工具类 CoordinateExtractUtil1.1 核心方法说明2. DesktopRobotUtil 修改2.1 功能概述2.2 核心方法解析鼠标操作键盘操作滚轮操作注意事项3. OperationController 接口三、结果演示一、引言在前文 基于GUI-PLUS 的桌面GUI交互全流程总结-CSDN博客 中一个最最简单的能把桌面上各种软件位置定位的办法被我搞出来了接下来我会用Java 的 Robot 方法来实现将这个定位好的坐标用到实际操作上。二、代码实现1. 新增工具类 CoordinateExtractUtilpackage gzj.spring.ai.util; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; /** * 从JSON坐标字符串中提取x/y值的工具方法 * author DELL */ public class CoordinateExtractUtil { // 复用单例ObjectMapper private static final ObjectMapper OBJECT_MAPPER new ObjectMapper(); /** * 提取JSON字符串中的x和y坐标 * param jsonStr 格式如 {x: 1860, y: 237} 的字符串 * return CoordinateMappingUtil.Point 对象包含x/y值 * throws Exception 解析失败时抛出异常 */ public static CoordinateMappingUtil.Point extractXY(String jsonStr) throws Exception { // 1. 校验入参 if (jsonStr null || jsonStr.trim().isEmpty()) { throw new IllegalArgumentException(JSON坐标字符串不能为空); } // 2. 解析JSON字符串为JsonNode JsonNode jsonNode OBJECT_MAPPER.readTree(jsonStr); // 3. 提取x/y值path()方法容错字段不存在时返回0避免空指针 int x jsonNode.path(x).asInt(); int y jsonNode.path(y).asInt(); // 4. 校验提取结果避免x/y均为0的无效情况 if (x 0 y 0) { throw new RuntimeException(未从JSON字符串中提取到有效坐标JSON jsonStr); } // 5. 返回Point对象 return new CoordinateMappingUtil.Point(x, y); } // 测试示例 public static void main(String[] args) { try { // 你的目标JSON字符串 String jsonStr {\x\: 1860, \y\: 237}; // 提取坐标 CoordinateMappingUtil.Point point extractXY(jsonStr); // 输出结果 System.out.println(提取的x值 point.getX()); // 输出 1860 System.out.println(提取的y值 point.getY()); // 输出 237 } catch (Exception e) { e.printStackTrace(); } } }该代码是一个Java工具类专门用于从JSON格式的坐标字符串中提取x/y数值并封装为Point对象。1.1 核心方法说明extractXY(String jsonStr)输入参数为JSON格式字符串如{x:1860,y:237}输出为包含x/y坐标的Point对象。方法执行流程如下参数非空校验若输入为空字符串或null抛出IllegalArgumentExceptionJSON解析使用Jackson库的ObjectMapper将字符串转为JsonNode对象坐标提取通过path()方法安全获取x/y字段值字段不存在时默认返回0有效性校验当x/y同时为0时抛出运行时异常可能JSON格式错误或字段缺失结果封装返回新建的Point对象2. DesktopRobotUtil 修改package gzj.spring.ai.util; import java.awt.*; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; /** * 桌面操作工具类基于java.awt.Robot * 支持鼠标移动、点击、滚轮滑动、键盘输入兼容屏幕缩放后的精准坐标 */ public class DesktopRobotUtil { private final Robot robot; // 屏幕分辨率初始化时自动获取 private final int screenWidth; private final int screenHeight; // 系统显示缩放比例如Windows 125%1.25需手动传入或自动识别 private final double scaleRatio; /** * 构造器初始化Robot屏幕参数 * param scaleRatio 系统显示缩放比例如1.25125% * throws AWTException Robot初始化失败如无AWT环境 */ public DesktopRobotUtil(double scaleRatio) throws AWTException { this.robot new Robot(); // 获取系统屏幕的物理分辨率 this.screenWidth Toolkit.getDefaultToolkit().getScreenSize().width; this.screenHeight Toolkit.getDefaultToolkit().getScreenSize().height; this.scaleRatio scaleRatio; // 设置自动等待操作间的默认间隔 robot.setAutoWaitForIdle(true); } // 鼠标基础操作 /** * 移动鼠标到指定坐标已校准的原始屏幕物理像素 * param x 校准后的X坐标 * param y 校准后的Y坐标 */ public void moveMouse(int x, int y) { // 若系统有缩放转换为Robot识别的逻辑像素可选根据实际场景 int logicX (int) Math.round(x / scaleRatio); int logicY (int) Math.round(y / scaleRatio); // 校验坐标在屏幕范围内 logicX Math.max(0, Math.min(screenWidth - 1, logicX)); logicY Math.max(0, Math.min(screenHeight - 1, logicY)); // 移动鼠标 robot.mouseMove(logicX, logicY); // 短暂延迟确保鼠标移动到位 robot.delay(300); } /** * 鼠标左键单击先移动到坐标再点击 * param x 校准后的X坐标 * param y 校准后的Y坐标 */ public void leftClick(int x, int y) { moveMouse(x, y); // 按下左键 robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); // 释放左键 robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); robot.delay(200); } /** * 鼠标右键单击 * param x 校准后的X坐标 * param y 校准后的Y坐标 */ public void rightClick(int x, int y) { moveMouse(x, y); robot.mousePress(InputEvent.BUTTON3_DOWN_MASK); robot.mouseRelease(InputEvent.BUTTON3_DOWN_MASK); robot.delay(200); } /** * 鼠标左键双击 * param x 校准后的X坐标 * param y 校准后的Y坐标 */ public void doubleClick(int x, int y) { // 1. 先移动到目标坐标确保位置准确 moveMouse(x, y); // 2. 第一次单击增加按压延迟模拟人类点击力度 robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); robot.delay(120); // 按压后停留200ms避免“轻触” robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); robot.delay(200); // 双击间隔设为300ms匹配Windows默认双击阈值 // 3. 第二次单击同样增加按压延迟 robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); robot.delay(120); robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); robot.delay(200); // 双击后等待1秒给软件启动的时间 } // 滚轮滑动操作 /** * 鼠标滚轮滑动上下 * param direction 方向正数向上负数向下 * param amount 滑动幅度推荐1-10 */ public void scrollWheel(int direction, int amount) { // Robot的scroll方法正数向上负数向下amount为滑动格数 robot.mouseWheel(direction * amount); robot.delay(500); } // 键盘操作 /** * 输入文本支持普通字符 * param text 要输入的文本 */ public void typeText(String text) { for (char c : text.toCharArray()) { // 转换字符为KeyCode基础字符 int keyCode KeyEvent.getExtendedKeyCodeForChar(c); if (keyCode ! KeyEvent.VK_UNDEFINED) { robot.keyPress(keyCode); robot.keyRelease(keyCode); robot.delay(50); } } } /** * 按下组合键如CtrlC、AltF4 * param keyCodes 键码数组如new int[]{KeyEvent.VK_CONTROL, KeyEvent.VK_C} */ public void pressCombinationKey(int[] keyCodes) { // 按下所有键 for (int keyCode : keyCodes) { robot.keyPress(keyCode); robot.delay(50); } // 释放所有键 for (int keyCode : keyCodes) { robot.keyRelease(keyCode); robot.delay(50); } } // 辅助方法 /** * 自动识别Windows系统的显示缩放比例可选需JNA依赖 * 若无JNA建议手动传入如1.25125% */ public static double getWindowsScaleRatio() { try { // 需引入JNA依赖可选 // import com.sun.jna.platform.win32.User32; // import com.sun.jna.platform.win32.WinDef; // WinDef.HDC hdc User32.INSTANCE.GetDC(null); // int dpi User32.INSTANCE.GetDeviceCaps(hdc, 88); // 水平DPI // User32.INSTANCE.ReleaseDC(null, hdc); // return dpi / 96.0; // Windows默认DPI96120DPI125% return 1.0; // 无JNA时默认1.0 } catch (Exception e) { return 1.0; } } // 测试示例 // public static void main(String[] args) { // try { // // 初始化工具类Windows 125%缩放1.25 // DesktopRobotUtil robotUtil new DesktopRobotUtil(1.25); // // // 1. 精准点击结合前文校准后的坐标 // int targetX 1753; // 校准后的X // int targetY 278; // 校准后的Y // robotUtil.leftClick(targetX, targetY); // System.out.println(已点击坐标( targetX , targetY )); // // // 2. 滚轮向下滑动 // robotUtil.scrollWheel(-1, 5); // -1向下5幅度 // System.out.println(已向下滑动滚轮5格); // // // 3. 输入文本 // robotUtil.typeText(Hello World!); // System.out.println(已输入文本Hello World!); // // // 4. 按下CtrlC // robotUtil.pressCombinationKey(new int[]{KeyEvent.VK_CONTROL, KeyEvent.VK_C}); // System.out.println(已按下CtrlC); // // } catch (AWTException e) { // e.printStackTrace(); // } // } }2.1 功能概述DesktopRobotUtil是一个基于 Java AWTRobot类的工具类用于模拟鼠标和键盘操作。支持以下功能鼠标移动、点击左键、右键、双击滚轮滑动键盘输入单字符、组合键自动校准屏幕缩放比例2.2 核心方法解析鼠标操作moveMouse(int x, int y)将鼠标移动到指定物理像素坐标自动根据缩放比例转换为逻辑像素。参数x/y校准后的屏幕坐标物理像素。内部逻辑通过scaleRatio转换坐标并限制在屏幕范围内。leftClick(int x, int y)移动到目标坐标后执行左键单击。调用moveMouse确保位置准确再触发mousePress和mouseRelease。doubleClick(int x, int y)模拟人类双击行为包含两次单击和合理的延迟。每次单击后增加 120ms 按压延迟双击间隔 200ms。键盘操作typeText(String text)逐字符输入文本支持普通字符跳过未定义键码的字符。使用KeyEvent.getExtendedKeyCodeForChar转换字符为键码。pressCombinationKey(int[] keyCodes)按下并释放组合键如CtrlC。参数keyCodes按顺序传入组合键的键码如{KeyEvent.VK_CONTROL, KeyEvent.VK_C}。滚轮操作scrollWheel(int direction, int amount)控制滚轮滑动方向和幅度。direction正数为向上负数为向下。amount滑动幅度推荐 1-10。注意事项权限问题某些操作系统可能需要特殊权限才能使用Robot。坐标范围自动校验坐标是否在屏幕物理分辨率范围内。3. OperationController 接口PostMapping(/operation/interact) public String interact(RequestBody OparetionRequest request) throws NoApiKeyException, UploadFileException, IOException, AWTException { log.info(接收交互请求{}, request); String result oparetionService.operation(request); CoordinateMappingUtil.Point point; try { DesktopRobotUtil robotUtil new DesktopRobotUtil(1.0); point extractXY(result); robotUtil.doubleClick(point.getX(), point.getY()); log.info(已点击坐标{}, point); } catch (Exception e) { log.error(交互异常, e); return 交互异常 e.getMessage(); } return String.valueOf(point); }三、结果演示如果觉得这份修改实用、总结清晰别忘了动动小手点个赞再关注一下呀 后续还会分享更多 AI 接口封装、代码优化的干货技巧一起解锁更多好用的功能少踩坑多提效 你的支持就是我更新的最大动力咱们下次分享再见呀