惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
Recent Commits to openclaw:main
Recent Commits to openclaw:main
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
罗磊的独立博客
V
Visual Studio Blog
爱范儿
爱范儿
H
Help Net Security
J
Java Code Geeks
I
InfoQ
Recent Announcements
Recent Announcements
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Recorded Future
Recorded Future
Jina AI
Jina AI
Microsoft Security Blog
Microsoft Security Blog
WordPress大学
WordPress大学
GbyAI
GbyAI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Y
Y Combinator Blog
Google DeepMind News
Google DeepMind News
Scott Helme
Scott Helme
S
SegmentFault 最新的问题
S
Securelist
L
LINUX DO - 热门话题
Cyberwarzone
Cyberwarzone
C
Cisco Blogs
Simon Willison's Weblog
Simon Willison's Weblog
G
Google Developers Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 叶小钗
T
The Blog of Author Tim Ferriss
博客园_首页
B
Blog
F
Fortinet All Blogs
AWS News Blog
AWS News Blog
V
Vulnerabilities – Threatpost
S
Secure Thoughts
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Forbes - Security
Forbes - Security
S
Security @ Cisco Blogs
T
Threat Research - Cisco Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
Schneier on Security
Project Zero
Project Zero
Martin Fowler
Martin Fowler
C
Cybersecurity and Infrastructure Security Agency CISA
N
Netflix TechBlog - Medium
N
News and Events Feed by Topic

博客园 - 我才是银古

第16章:常见问题、排错与最佳实践 第15章:扩展生态、MCAD 与外部集成 第12章:实战案例:机械结构与 3D 打印零件 第14章:构建、测试、调试与贡献流程 第13章:OpenSCAD 源码架构与核心执行流程 第11章:预览、渲染、网格精度与性能优化 第09章:列表推导、递归与算法建模 第08章:参数化零件库与复用设计 第10章:导入导出、命令行与自动化 第06章:CSG 布尔建模方法 第07章:二维图形、拉伸、旋转与投影 第05章:基础几何、坐标系与变换 第04章:参数、变量、函数、模块与作用域 OpenSCAD 教程目录 第03章:OpenSCAD 语言基础 第02章:安装、环境配置与开发工作流 第01章:OpenSCAD 项目全景与学习路线 第02章:源码获取、编译与开发环境配置 第01章:OCCT项目全景与学习路线 第18章:二次开发实战与综合案例 第18章:综合实战案例 第17章:数据交换与协同 第16章:源码架构与二次开发 第15章:插件与自定义工作台开发 第14章:Python脚本宏与自动化 第13章:FEM仿真分析 第12章:CAM数控加工 第11章:SurfaceMesh与逆向工程 第10章:Draft二维绘图与BIM建筑 第09章:工程图TechDraw 第07章:参数化表达式与Spreadsheet 第08章:装配设计Assembly 第06章:Part工作台与几何内核 第05章:PartDesign实体特征建模 第04章:草图Sketcher约束建模 第02章:安装版本与工作环境配置 第03章:界面工作台与基础操作 第01章:项目全景与学习路线 第十二章:插件开发、研究功能与最佳实践 第十章:定时任务与自动化(Cron) 第七章:技能、记忆与自学习闭环 第八章:MCP 集成与上下文文件 第六章:工具系统与终端后端 第五章:模型供应商与配置体系 Hermes Agent 教程目录 第十一章:语音、视觉、浏览器与子代理协作 第四章:CLI/TUI 与会话管理 第十二章:学习路线、实战方案与最佳实践 第十一章:源码结构、开发调试与插件开发 第十章:自动化、远程访问、日志与排障 第九章:Control UI、节点、Canvas 与语音能力 第七章:工具、技能、插件与能力扩展 第八章:安全模型、访问控制与沙箱实践 第六章:Agent 工作区、会话与多智能体路由 第五章:多通道消息接入与聊天平台配置 第四章:配置体系、模型接入与认证管理 第三章:Gateway 架构、协议与运行机制 第二章:安装、环境准备与快速上手 第一章:OpenClaw 项目概览与核心定位 oh-my-openagent 教程目录 09-命令模型回退与配置参考 10-实战案例最佳实践与故障排除 05-工作模式-Ultrawork-Prometheus-Atlas 08-Hooks与MCP系统 06-Category与Skill系统 07-核心工具链 04-智能体全景详解 03-安装与环境配置 02-整体架构与多模型编排机制 01-项目简介与核心理念 01-项目概览与学习路线 02-安装部署与工具适配 03-Skill机制与using-superpowers 05-TDD系统化调试与完成前验证 04-需求澄清方案设计与计划编写 07-并行智能体子智能体与Git-Worktree 第六章:代码审查、反馈处理与分支收尾 08-中国特色Skills与本土团队落地 09-MCP构建工作流执行与自定义Skill 第23章:FreeCAD-Python-API Clipper2 C# 源码解读教程 第19章:PolyTree 多边形树结构 第20章:实际应用与最佳实践 第18章:Minkowski 和与差 第17章:RectClip 矩形裁剪优化 第16章:ClipperOffset 偏移类详解 第15章:填充规则详解 第14章:布尔运算执行流程 第13章:ClipperD 浮点裁剪类 第11章:OutRec 与 OutPt 输出结构 第9章:Active 活动边结构 第10章:Vertex 顶点与 LocalMinima 局部极小值 第12章:Clipper64 裁剪类详解 第7章:高精度运算与128位整数 第8章:ClipperBase 基类详解 第5章:枚举类型与常量定义 第6章:InternalClipper 内部工具类 第2章:核心数据结构 - Point64、PointD 第3章:路径与多边形表示 - Path64、PathD、Paths64、PathsD 第4章:矩形边界 - Rect64、RectD
第03章 - 快速入门:第一个自动化程序
我才是银古 · 2026-06-24 · via 博客园 - 我才是银古

第03章 - 快速入门:第一个自动化程序

环境就绪后,本章我们将通过一系列由简到繁的小程序,快速建立对 RobotGo 的整体手感。你将看到鼠标、键盘、屏幕、剪贴板、提示框等核心能力如何用极少的代码组合起来,最终完成一个“记事本自动化”小例子。本章重在“跑通”和“体感”,每个 API 的细节会在后续章节深入展开。

3.1 程序骨架

所有 RobotGo 程序的结构都非常简单:导入包,然后调用函数。下面是最小骨架:

package main

import (
    "fmt"

    "github.com/go-vgo/robotgo"
)

func main() {
    fmt.Println("RobotGo 启动")
}

3.2 移动鼠标并点击

让我们从最直观的鼠标控制开始。下面的程序会把鼠标移动到屏幕坐标 (500, 300),然后点击一次左键:

package main

import (
    "fmt"

    "github.com/go-vgo/robotgo"
)

func main() {
    // 移动到指定坐标
    robotgo.Move(500, 300)

    // 读取当前鼠标位置确认
    x, y := robotgo.Location()
    fmt.Println("当前位置:", x, y)

    // 点击左键
    robotgo.Click()

    // 点击右键
    robotgo.Click("right")

    // 双击左键
    robotgo.Click("left", true)
}

这里需要理解几个要点:

  • 坐标系原点 (0, 0) 通常位于主显示器的左上角,x 向右增大,y 向下增大。
  • robotgo.Move 是瞬间移动;如果想要平滑(带动画轨迹)移动,可使用 robotgo.MoveSmooth
  • robotgo.Click 不带参数默认点击左键,可传入 "right""center"(中键)等。

3.3 控制鼠标移动节奏

很多时候我们希望操作之间有一点延迟,让目标程序有时间响应。RobotGo 提供了全局变量 MouseSleep 来统一控制鼠标操作后的等待毫秒数:

robotgo.MouseSleep = 300 // 每次鼠标操作后等待 300 毫秒

robotgo.Move(100, 100)
robotgo.MoveSmooth(300, 300) // 平滑移动
robotgo.Move(100, -200)      // 支持多屏:负坐标可落到主屏左侧的副屏

类似地,键盘操作有 KeySleep 变量。这两个变量是控制自动化“节奏”的利器,后续章节会反复用到。

3.4 输入文本与按键

接下来体验键盘控制。robotgo.Type 用于输入一段文本(支持中英文、日文等 Unicode),robotgo.KeyTap 用于敲击单个按键或组合键:

package main

import "github.com/go-vgo/robotgo"

func main() {
    // 输入英文
    robotgo.Type("Hello, RobotGo!")

    // 输入中文(Unicode 文本同样支持)
    robotgo.Type("你好,世界")

    // 敲击回车键
    robotgo.KeyTap("enter")

    // 组合键:Ctrl + A 全选(macOS 上可用 "cmd")
    robotgo.KeyTap("a", "ctrl")

    // 组合键:Ctrl + C 复制
    robotgo.KeyTap("c", "ctrl")
}

KeyTap 的第一个参数是主键,后面跟随任意数量的修饰键(如 ctrlaltshiftcmd)。完整的按键名称列表会在第 5 章详细列出。

3.5 读写剪贴板

RobotGo 内置了简单的剪贴板读写函数 WriteAllReadAll

package main

import (
    "fmt"

    "github.com/go-vgo/robotgo"
)

func main() {
    // 写入剪贴板
    robotgo.WriteAll("通过 RobotGo 写入剪贴板的内容")

    // 读取剪贴板
    text, err := robotgo.ReadAll()
    if err != nil {
        fmt.Println("读取失败:", err)
        return
    }
    fmt.Println("剪贴板内容:", text)
}

剪贴板配合 KeyTap("v", "ctrl") 粘贴,是实现“批量输入大段文本”的高效方式(比逐字 Type 更快、更稳)。

3.6 读取屏幕信息与像素颜色

自动化往往需要“看见”屏幕。下面的程序读取屏幕尺寸,并获取某个坐标点的像素颜色:

package main

import (
    "fmt"

    "github.com/go-vgo/robotgo"
)

func main() {
    sx, sy := robotgo.GetScreenSize()
    fmt.Println("屏幕尺寸:", sx, sy)

    // 获取坐标 (100, 200) 处像素的颜色,返回十六进制字符串,如 "ffffff"
    color := robotgo.GetPixelColor(100, 200)
    fmt.Println("像素颜色:", color)
}

GetPixelColor 返回的是不带 # 的十六进制颜色字符串。通过比对像素颜色,可以判断界面是否处于某个预期状态(例如某个按钮是否变绿)。

3.7 截图保存

将屏幕区域截图保存为图片是图像识别的基础。RobotGo 提供了便捷的 SaveCapture

package main

import "github.com/go-vgo/robotgo"

func main() {
    // 截取整个屏幕并保存
    robotgo.SaveCapture("full.png")

    // 截取从 (10, 10) 开始、宽 300 高 200 的区域
    robotgo.SaveCapture("region.png", 10, 10, 300, 200)
}

更底层的 CaptureScreen / CaptureImg 以及位图查找会在第 7、8 章详细讲解。

3.8 弹出系统提示框

RobotGo 还能弹出原生的系统对话框,用于交互或调试:

package main

import (
    "fmt"

    "github.com/go-vgo/robotgo"
)

func main() {
    ok := robotgo.Alert("RobotGo", "这是一个提示框,点击确定继续")
    if ok {
        fmt.Println("用户点击了确定")
    } else {
        fmt.Println("用户取消了")
    }
}

3.9 综合示例:自动化记事本

现在把上面的能力组合起来,做一个简单但完整的小例子:打开(假设已手动打开)一个文本编辑器后,自动输入文本、全选、复制,并读取剪贴板验证。

package main

import (
    "fmt"

    "github.com/go-vgo/robotgo"
)

func main() {
    // 设置操作节奏,给目标程序留出响应时间
    robotgo.MouseSleep = 200
    robotgo.KeySleep = 100

    // 给用户 3 秒时间切换到目标编辑器窗口
    fmt.Println("请在 3 秒内切换到文本编辑器窗口...")
    robotgo.Sleep(3)

    // 输入多行文本
    robotgo.Type("第一行:RobotGo 自动化演示")
    robotgo.KeyTap("enter")
    robotgo.Type("第二行:你好,世界")
    robotgo.KeyTap("enter")
    robotgo.Type("第三行:Hello, World")

    // 全选并复制(Windows/Linux 用 ctrl,macOS 用 cmd)
    robotgo.KeyTap("a", "ctrl")
    robotgo.KeyTap("c", "ctrl")

    // 从剪贴板读取并打印
    text, err := robotgo.ReadAll()
    if err != nil {
        fmt.Println("读取剪贴板失败:", err)
        return
    }
    fmt.Println("------ 编辑器中的内容 ------")
    fmt.Println(text)
}

运行这段程序时,请先打开一个文本编辑器(记事本、TextEdit、gedit 等),运行后迅速点进编辑器窗口。3 秒后程序会自动输入三行文字、全选复制,并把内容打印到控制台。

跨平台提示:复制粘贴的修饰键在 macOS 上通常是 cmd 而非 ctrl。编写跨平台脚本时,可以根据 runtime.GOOS 选择修饰键,第 13 章会演示这种写法。

3.10 延时与节奏控制函数一览

在自动化脚本中,合理的等待至关重要。RobotGo 提供了多种延时方式:

robotgo.Sleep(1)        // 秒级休眠:休眠 1 秒
robotgo.MilliSleep(100) // 毫秒级休眠:休眠 100 毫秒
robotgo.MouseSleep = 50 // 每次鼠标操作后自动等待 50 毫秒
robotgo.KeySleep = 30   // 每次键盘操作后自动等待 30 毫秒

Sleep / MilliSleep 是显式的“等一会儿”,而 MouseSleep / KeySleep 是隐式地为每一次操作附加固定延迟,二者结合使用能让脚本既稳定又可控。

3.11 小结

本章我们用一连串短小的示例快速体验了 RobotGo 的核心能力:移动点击鼠标、输入文本与按键、读写剪贴板、读取屏幕尺寸与像素、截图、弹出提示框,并通过一个“自动化记事本”综合示例把它们串联起来。你现在应该对 RobotGo 的编程风格有了直观感受。从下一章开始,我们将逐个模块深入,先从鼠标控制讲起。