February 2, 2025
By: Kevin

Java Robot:可以模拟系统鼠标/键盘操作的自动机器人

客户系统中, 要做一个自定义的软键盘, 涉及到如何模拟键盘事件.

调研过程中发现JDK对此支持的还不错. 能够记录用户外设/直接操作外设.

java.awt.Robot 类控制鼠标和键盘, 模拟用户输入. 做个软键盘确实不在话下了.

这在自动化测试, 演示, 甚至创建简单的机器人时非常有用. 本文将展示如何在Clojure中使用它.

甚至是跨平台的, 在windows/mac/linux上均通过测试.

核心功能:

  • 模拟输入: 生成键盘按键和鼠标移动/点击.
  • 屏幕截图: 可以捕获屏幕的一部分作为图像.
  • 底层控制: 在底层运行, 直接与操作系统交互.

基本用法(Clojure示例):

  1. 创建 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)))
    
  2. 鼠标控制:

    (when robot
      (.mouseMove robot x y)  ;; 将鼠标移动到 (x, y)
      (.mousePress robot InputEvent/BUTTON1_DOWN_MASK)  ;; 模拟鼠标左键按下
      (.mouseRelease robot InputEvent/BUTTON1_DOWN_MASK)) ;; 模拟鼠标左键释放
    
  3. 键盘控制:

    (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 交互的工具. 需要负责任地使用它.

Tags: clojure