|
|
@@ -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();
|
|
|
+ }
|
|
|
+}
|