소스 검색

feat:使用swing中robot类实现自动输入功能

yang yi 3 주 전
부모
커밋
8bfa2f2828
1개의 변경된 파일308개의 추가작업 그리고 0개의 파일을 삭제
  1. 308 0
      src/main/java/space/anyi/autoInputRobot/core/AwtAutoInputRobot.java

+ 308 - 0
src/main/java/space/anyi/autoInputRobot/core/AwtAutoInputRobot.java

@@ -0,0 +1,308 @@
+package space.anyi.autoInputRobot.core;
+
+import java.awt.*;
+import java.awt.event.KeyEvent;
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @ProjectName: AutoInputRobot
+ * @FileName: AwtAutoInputRobot
+ * @Author: 杨逸
+ * @Data:2025/11/13 11:57
+ * @Description:
+ */
+
+
+
+public class AwtAutoInputRobot {
+    private Robot robot;
+
+    // 需要Shift键的特殊字符集合
+    private static final Set<Character> SHIFT_CHARS = new HashSet<>();
+
+    static {
+        // 初始化需要Shift键的字符
+        SHIFT_CHARS.add('~');
+        SHIFT_CHARS.add('!');
+        SHIFT_CHARS.add('@');
+        SHIFT_CHARS.add('#');
+        SHIFT_CHARS.add('$');
+        SHIFT_CHARS.add('%');
+        SHIFT_CHARS.add('^');
+        SHIFT_CHARS.add('&');
+        SHIFT_CHARS.add('*');
+        SHIFT_CHARS.add('(');
+        SHIFT_CHARS.add(')');
+        SHIFT_CHARS.add('_');
+        SHIFT_CHARS.add('+');
+        SHIFT_CHARS.add('{');
+        SHIFT_CHARS.add('}');
+        SHIFT_CHARS.add('|');
+        SHIFT_CHARS.add(':');
+        SHIFT_CHARS.add('"');
+        SHIFT_CHARS.add('<');
+        SHIFT_CHARS.add('>');
+        SHIFT_CHARS.add('?');
+        SHIFT_CHARS.add('A');SHIFT_CHARS.add('B');SHIFT_CHARS.add('C');SHIFT_CHARS.add('D');
+        SHIFT_CHARS.add('E');SHIFT_CHARS.add('F');SHIFT_CHARS.add('G');SHIFT_CHARS.add('H');
+        SHIFT_CHARS.add('I');SHIFT_CHARS.add('J');SHIFT_CHARS.add('K');SHIFT_CHARS.add('L');
+        SHIFT_CHARS.add('M');SHIFT_CHARS.add('N');SHIFT_CHARS.add('O');SHIFT_CHARS.add('P');
+        SHIFT_CHARS.add('Q');SHIFT_CHARS.add('R');SHIFT_CHARS.add('S');SHIFT_CHARS.add('T');
+        SHIFT_CHARS.add('U');SHIFT_CHARS.add('V');SHIFT_CHARS.add('W');SHIFT_CHARS.add('X');
+        SHIFT_CHARS.add('Y');SHIFT_CHARS.add('Z');
+    }
+
+    public AwtAutoInputRobot() {
+        try {
+            robot = new Robot();
+            // 设置自动延迟,使动作更自然
+            robot.setAutoDelay(3);
+        } catch (AWTException e) {
+            System.err.println("无法创建Robot实例: " + e.getMessage());
+            System.exit(1);
+        }
+    }
+
+    public void startAutoInput() {
+        System.out.println("程序已启动,5秒后开始自动输入...");
+        System.out.println("请确保已将焦点切换到目标输入区域!");
+
+        // 等待5秒
+        robot.delay(5000);
+
+        // 读取文件内容
+        String content = readFile("E:\\tmp\\xxt\\src\\main\\resources\\a.txt");
+        if (content == null || content.isEmpty()) {
+            System.err.println("文件为空或读取失败");
+            return;
+        }
+
+        System.out.println("开始自动输入...");
+        System.out.println("输入内容: " + content);
+
+        // 模拟输入文件内容
+        typeString(content);
+
+        System.out.println("自动输入完成!");
+    }
+
+    private String readFile(String filename) {
+        StringBuilder content = new StringBuilder();
+        try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
+            String line;
+            while ((line = reader.readLine()) != null) {
+                content.append(line).append("\n");
+            }
+        } catch (IOException e) {
+            System.err.println("读取文件失败: " + e.getMessage());
+            return null;
+        }
+        return content.toString();
+    }
+
+    private void typeString(String text) {
+        for (char c : text.toCharArray()) {
+            typeChar(c);
+            // 每个字符输入后稍作延迟
+            //robot.delay(30);
+        }
+    }
+
+    private void typeChar(char c) {
+        boolean needShift = SHIFT_CHARS.contains(c) || Character.isUpperCase(c);
+
+        if (needShift) {
+            robot.keyPress(KeyEvent.VK_SHIFT);
+        }
+
+        try {
+            // 处理特殊字符
+            switch (c) {
+                case '\n':
+                    robot.keyPress(KeyEvent.VK_ENTER);
+                    robot.keyRelease(KeyEvent.VK_ENTER);
+                    break;
+                case '\t':
+                    robot.keyPress(KeyEvent.VK_TAB);
+                    robot.keyRelease(KeyEvent.VK_TAB);
+                    break;
+                case ' ':
+                    robot.keyPress(KeyEvent.VK_SPACE);
+                    robot.keyRelease(KeyEvent.VK_SPACE);
+                    break;
+                case '!':
+                    robot.keyPress(KeyEvent.VK_1);
+                    robot.keyRelease(KeyEvent.VK_1);
+                    break;
+                case '@':
+                    robot.keyPress(KeyEvent.VK_2);
+                    robot.keyRelease(KeyEvent.VK_2);
+                    break;
+                case '#':
+                    robot.keyPress(KeyEvent.VK_3);
+                    robot.keyRelease(KeyEvent.VK_3);
+                    break;
+                case '$':
+                    robot.keyPress(KeyEvent.VK_4);
+                    robot.keyRelease(KeyEvent.VK_4);
+                    break;
+                case '%':
+                    robot.keyPress(KeyEvent.VK_5);
+                    robot.keyRelease(KeyEvent.VK_5);
+                    break;
+                case '^':
+                    robot.keyPress(KeyEvent.VK_6);
+                    robot.keyRelease(KeyEvent.VK_6);
+                    break;
+                case '&':
+                    robot.keyPress(KeyEvent.VK_7);
+                    robot.keyRelease(KeyEvent.VK_7);
+                    break;
+                case '*':
+                    robot.keyPress(KeyEvent.VK_8);
+                    robot.keyRelease(KeyEvent.VK_8);
+                    break;
+                case '(':
+                    robot.keyPress(KeyEvent.VK_9);
+                    robot.keyRelease(KeyEvent.VK_9);
+                    break;
+                case ')':
+                    robot.keyPress(KeyEvent.VK_0);
+                    robot.keyRelease(KeyEvent.VK_0);
+                    break;
+                case '_':
+                    robot.keyPress(KeyEvent.VK_MINUS);
+                    robot.keyRelease(KeyEvent.VK_MINUS);
+                    break;
+                case '+':
+                    robot.keyPress(KeyEvent.VK_EQUALS);
+                    robot.keyRelease(KeyEvent.VK_EQUALS);
+                    break;
+                case '{':
+                    robot.keyPress(KeyEvent.VK_OPEN_BRACKET);
+                    robot.keyRelease(KeyEvent.VK_OPEN_BRACKET);
+                    break;
+                case '}':
+                    robot.keyPress(KeyEvent.VK_CLOSE_BRACKET);
+                    robot.keyRelease(KeyEvent.VK_CLOSE_BRACKET);
+                    break;
+                case '|':
+                    robot.keyPress(KeyEvent.VK_BACK_SLASH);
+                    robot.keyRelease(KeyEvent.VK_BACK_SLASH);
+                    break;
+                case ':':
+                    robot.keyPress(KeyEvent.VK_SEMICOLON);
+                    robot.keyRelease(KeyEvent.VK_SEMICOLON);
+                    break;
+                case '"':
+                    robot.keyPress(KeyEvent.VK_QUOTE);
+                    robot.keyRelease(KeyEvent.VK_QUOTE);
+                    break;
+                case '<':
+                    robot.keyPress(KeyEvent.VK_COMMA);
+                    robot.keyRelease(KeyEvent.VK_COMMA);
+                    break;
+                case '>':
+                    robot.keyPress(KeyEvent.VK_PERIOD);
+                    robot.keyRelease(KeyEvent.VK_PERIOD);
+                    break;
+                case '?':
+                    robot.keyPress(KeyEvent.VK_SLASH);
+                    robot.keyRelease(KeyEvent.VK_SLASH);
+                    break;
+                case '~':
+                    robot.keyPress(KeyEvent.VK_BACK_QUOTE);
+                    robot.keyRelease(KeyEvent.VK_BACK_QUOTE);
+                    break;
+                default:
+                    // 处理字母和数字
+                    if (Character.isLetterOrDigit(c)) {
+                        int keyCode = getKeyCode(Character.toUpperCase(c));
+                        if (keyCode != 0) {
+                            robot.keyPress(keyCode);
+                            robot.keyRelease(keyCode);
+                        }
+                    } else {
+                        // 其他字符尝试直接映射
+                        int keyCode = getKeyCode(Character.toUpperCase(c));
+                        if (keyCode != 0) {
+                            robot.keyPress(keyCode);
+                            robot.keyRelease(keyCode);
+                        }
+                    }
+                    break;
+            }
+        } finally {
+            // 确保释放Shift键
+            if (needShift) {
+                robot.keyRelease(KeyEvent.VK_SHIFT);
+            }
+        }
+    }
+
+    private int getKeyCode(char c) {
+        // 字母
+        if (c >= 'A' && c <= 'Z') {
+            return KeyEvent.VK_A + (c - 'A');
+        }
+
+        // 数字
+        if (c >= '0' && c <= '9') {
+            return KeyEvent.VK_0 + (c - '0');
+        }
+
+        // 不需要Shift的特殊字符
+        switch (c) {
+            case '[':
+                return KeyEvent.VK_OPEN_BRACKET;
+            case ']':
+                return KeyEvent.VK_CLOSE_BRACKET;
+            case ';':
+                return KeyEvent.VK_SEMICOLON;
+            case '\'':
+                return KeyEvent.VK_QUOTE;
+            case ',':
+                return KeyEvent.VK_COMMA;
+            case '.':
+                return KeyEvent.VK_PERIOD;
+            case '/':
+                return KeyEvent.VK_SLASH;
+            case '\\':
+                return KeyEvent.VK_BACK_SLASH;
+            case '`':
+                return KeyEvent.VK_BACK_QUOTE;
+            case '-':
+                return KeyEvent.VK_MINUS;
+            case '=':
+                return KeyEvent.VK_EQUALS;
+            default:
+                return 0; // 未知字符
+        }
+    }
+
+    public static void main(String[] args) {
+        // 安全提示
+        System.out.println("=== 自动输入机器人 ===");
+        System.out.println("警告:此程序将在5秒后开始自动输入!");
+        System.out.println("请确保:");
+        System.out.println("1. a.txt文件存在于当前目录");
+        System.out.println("2. 已将焦点切换到需要输入的应用程序");
+        System.out.println("3. 你有5秒时间准备");
+        System.out.println("按Ctrl+C可以终止程序");
+        System.out.println("====================");
+
+        try {
+            Thread.sleep(1000); // 给用户2秒时间阅读提示
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            return;
+        }
+
+        AwtAutoInputRobot autoInput = new AwtAutoInputRobot();
+        autoInput.startAutoInput();
+    }
+}