February 2, 2025
By: Kevin
Java Robot:可以模拟系统鼠标/键盘操作的自动机器人
客户系统中, 要做一个自定义的软键盘, 涉及到如何模拟键盘事件.
调研过程中发现JDK对此支持的还不错. 能够记录用户外设/直接操作外设.
java.awt.Robot 类控制鼠标和键盘, 模拟用户输入. 做个软键盘确实不在话下了.
这在自动化测试, 演示, 甚至创建简单的机器人时非常有用. 本文将展示如何在Clojure中使用它.
甚至是跨平台的, 在windows/mac/linux上均通过测试.
核心功能:
- 模拟输入: 生成键盘按键和鼠标移动/点击.
- 屏幕截图: 可以捕获屏幕的一部分作为图像.
- 底层控制: 在底层运行, 直接与操作系统交互.
基本用法(Clojure示例):
创建 Robot 实例:
(ns my-robot-example (:import [java.awt Robot AWTException] [java.awt.event InputEvent KeyEvent])) (def robot (try (Robot.) (catch AWTException e (println (str "Error creating Robot: " (.getMessage e))) nil)))鼠标控制:
(when robot (.mouseMove robot x y) ;; 将鼠标移动到 (x, y) (.mousePress robot InputEvent/BUTTON1_DOWN_MASK) ;; 模拟鼠标左键按下 (.mouseRelease robot InputEvent/BUTTON1_DOWN_MASK)) ;; 模拟鼠标左键释放键盘控制:
(when robot (.keyPress robot KeyEvent/VK_A) ;; 按下 'A' 键 (.keyRelease robot KeyEvent/VK_A)) ;; 释放 'A' 键
示例:键入"你好"
以下示例展示了如何使用 type-string 函数键入字符串:
(ns clj-scada.modules.keyboard.robot
(:import [java.awt Robot]
[java.awt Toolkit]
[java.awt.event KeyEvent]))
(defonce robot (Robot.))
(defn type-string [^String s]
(.setAutoDelay robot 40) ; 调整延迟时间
(doseq [c s]
(let [code (int c)]
(cond
(Character/isLetter c)
(let [key-code (int (Character/toUpperCase c))]
(when (Character/isLowerCase c)
(.keyPress robot KeyEvent/VK_SHIFT))
(.keyPress robot key-code)
(.keyRelease robot key-code)
(when (Character/isLowerCase c)
(.keyRelease robot KeyEvent/VK_SHIFT)))
(Character/isDigit c)
(let [key-code (+ KeyEvent/VK_0 (- code (int \0)))]
(.keyPress robot key-code)
(.keyRelease robot key-code))
(= c \space)
(do (.keyPress robot KeyEvent/VK_SPACE)
(.keyRelease robot KeyEvent/VK_SPACE))
(= c \.)
(do (.keyPress robot KeyEvent/VK_PERIOD)
(.keyRelease robot KeyEvent/VK_PERIOD))
; 添加更多字符处理...
:else
(println (str "Unsupported character: " c))))))
(type-string "你好")
**重要注意事项: **
- 安全性: 请注意安全隐患. 恶意使用是可能的.
- 平台依赖性: 在不同操作系统上的行为可能略有不同.
- 可访问性: 确保你的自动化不会干扰辅助功能.
- 延迟: 使用
(.delay robot time-in-ms)添加操作之间的暂停, 以避免错误.
java.awt.Robot 提供了强大的自动化 UI 交互的工具. 需要负责任地使用它.