- RPA
- GUI 自动化
【免费下载链接】robotgo
RobotGo, Go Native cross-platform RPA, GUI automation, Auto test and Computer use @vcaesar
本文以仓库内
lang/README.ja.md(RobotGo 项目日文版 README)为主体骨架,结合仓库源码、示例与文档进行纵深展开。RobotGo 是一个用 Go 语言编写、面向桌面自动化(Desktop Automation)、自动测试(Auto Test)与 AI 计算机操作(Computer Use)的跨平台库,可控制鼠标与键盘、读取屏幕、操作进程与窗口句柄、处理图像与位图,并监听全局事件。读完本文,你将掌握 RobotGo 的依赖环境配置、安装与升级、Cgo-free 纯 Go 构建标签体系,以及鼠标、键盘、屏幕、位图、OpenCV 图像识别、全局事件钩子、窗口与进程管理等七大模块的完整实战写法,并理解各 API 背后的源码级实现原理。
1. 项目概览:RobotGo 能做什么
RobotGo 是面向桌面场景的 Go 原生自动化工具包,官方定位覆盖三类典型应用:
- 桌面自动化(Desktop Automation):模拟鼠标移动、点击、滚轮与键盘输入;
- 自动测试(Auto Test):配合屏幕捕获、位图查找、OpenCV 图像识别完成 GUI 测试断言;
- AI Computer Use:将“看屏幕 + 找图 + 操作鼠标键盘”串成闭环,作为 Agent 操作计算机的执行层。
官方说明(README 及 robotgo.go 包注释)指出:RobotGo 支持Mac、Windows、Linux三大桌面系统,并支持arm64 与 x86-amd64架构。底层默认通过 Cgo 调用各平台原生 API(macOS 的 Quartz/Cocoa、Windows 的 Win32、Linux 的 X11/XTest),同时提供了可在CGO_ENABLED=0下交叉编译的纯 Go 后端(详见第 4 节)。
从仓库结构看,顶层robotgo.go是默认 Cgo 后端的总入口,robotgo_pub.go是不依赖任何构建标签的公共 API(版本、睡眠、位图结构、公共变量),而win、darwin、x11、wayland、libei五个子目录则分别承载各平台的纯 Go 实现。
2. 环境依赖(Requirements)
官方文档强调:安装 RobotGo 之前,必须确保Golang 与 GCC已正确安装。不同平台的具体前置条件如下。
2.1 全部平台
Golang GCC2.2 MacOS
brew install go同时需要 Xcode 命令行工具:
xcode-select --install权限配置:在「系统设置 > 隐私与安全 > 辅助功能、屏幕与系统音频录制」中添加「屏幕录制」和「辅助功能」权限,否则屏幕捕获与事件注入会被系统拦截。
2.3 Windows
winget install Golang.goGCC 工具链可选择以下任一方案:
# 方案一:llvm-mingw winget install MartinStorsjo.LLVM-MinGW.UCRT # 方案二:Mingw-w64(WinLibs 构建) winget install BrechtSanders.WinLibs.POSIX.UCRT也可以手动下载 Mingw-w64 或其他 GCC 发行版,将C:\mingw64\bin之类的路径加入系统环境变量Path。需要注意:使用非 Mingw-w64 的 GCC 时,若用到 bitmap 位图库,需要自行编译 libpng。
2.4 Linux(X11 桌面)
默认的 Cgo/X11 后端需要如下系统库:
GCC X11 扩展 XTest(Xtst 库) "Clipboard": xsel xclip "Bitmap": libpng(仅被 "bitmap" 使用) "Event-Gohook": xcb, xkb, libxkbcommon(仅被 "hook" 使用)Ubuntu / Debian
# sudo apt install golang sudo snap install go --classic # gcc sudo apt install gcc libc6-dev # x11 sudo apt install libx11-dev xorg-dev libxtst-dev # Clipboard sudo apt install xsel xclip # Bitmap sudo apt install libpng++-dev # GoHook sudo apt install xcb libxcb-xkb-dev x11-xkb-utils libx11-xcb-dev libxkbcommon-x11-dev libxkbcommon-devFedora
# x11 sudo dnf install libXtst-devel # Clipboard sudo dnf install xsel xclip # Bitmap sudo dnf install libpng-devel # GoHook sudo dnf install libxkbcommon-devel libxkbcommon-x11-devel xkbcomp-devel xorg-x11-xkb-utils-devel (< Fedora 34)源码佐证:默认 Cgo 后端的链接参数在 robotgo.go 中通过#cgo指令声明,Linux 使用-lX11 -lXtst,Windows 使用-lgdi32 -luser32,macOS 使用 Cocoa/CoreFoundation/IOKit/Carbon 等框架,macOS 14.05 以上还会链接 ScreenCaptureKit。
2.5 Wayland(Linux)
Wayland 后端是**纯 Go(Cgo-free)**实现,不需要任何系统 C 库,但需要一个支持以下 wlroots 协议的合成器(compositor):
zwlr_virtual_pointer_v1 (鼠标控制) zwp_virtual_keyboard_v1 (键盘控制) zwlr_screencopy_v1 (屏幕捕获) zwlr_foreign_toplevel_management_v1 (窗口管理)支持这些协议的典型合成器包括Sway、Hyprland、Wayfire等。文档明确提示:GNOME 与 KDE 原生不支持这些协议。仓库中对应的 wlroots 协议绑定位于 wayland/internal/protocols 目录(含 foreign_toplevel、screencopy、virtual_keyboard、virtual_pointer 四个子包),纯 Go 实现位于 wayland 包。
2.6 libei(GNOME / KDE)
libei 后端同样是**纯 Go(Cgo-free)**实现,它通过 freedesktop 的xdg-desktop-portalRemoteDesktop 接口驱动输入,因此与 wlroots Wayland 后端不同,可以在 GNOME 和 KDE 上运行。需要安装:
xdg-desktop-portal (portal D-Bus 服务) xdg-desktop-portal-gnome / -kde (当前桌面对应的 portal 后端)注意:libei 后端只处理鼠标和键盘输入,屏幕捕获与窗口管理会返回ErrNotSupported。该哨兵错误在 wayland_n.go 等构建标签文件中与ErrNoConnection一起被别名导出,便于跨包使用errors.Is判断。
3. 安装与更新(Installation / Update)
支持 Go Modules(Go 1.11+)的项目只需 import 即可:
import "github.com/go-vgo/robotgo"若需手动安装:
go get github.com/go-vgo/robotgo更新到最新版本:
go get -u github.com/go-vgo/robotgo官方文档同时提醒两个历史注意事项:go1.10.x 存在 C 文件编译缓存问题(golang #24355),以及go mod vendor的相关问题(golang #26366)。若在安装时遇到png.h: No such file or directory报错,说明系统中缺少 libpng 头文件,可参照上文 Ubuntu/Fedora 章节安装对应依赖包。
仓库的 go.mod 显示当前模块版本为v2.00.0.1658, MT. Baker!(定义于 robotgo_pub.go,可通过robotgo.GetVersion()获取),依赖包括 purego、jezek/xgb、vcaesar/gops、vcaesar/keycode、vcaesar/screenshot、vcaesar/imgo 等关键库。
4. Cgo-free 构建:一套 API,五种纯 Go 后端
这是 README 中信息密度最高的章节,也是 RobotGo 面向现代 Linux 桌面与交叉编译的关键能力。官方说明:RobotGo 为Windows、macOS、X11、Wayland、libei(Linux)提供纯 Go(Cgo-free)后端,目前处于实验阶段。这些后端暴露完全相同的robotgoAPI,业务代码零改动,只需切换构建标签,即可在CGO_ENABLED=0下交叉编译(不再需要 GCC、MinGW、Xcode 或 X11 头文件)。
4.1 后端与构建标签对照表
| 后端 | 构建标签 | Go 包 |
|---|---|---|
| Windows(Cgo-free) | win | github.com/go-vgo/robotgo/win |
| macOS(经 purego 调用 Quartz) | mac | github.com/go-vgo/robotgo/darwin |
| X11(Linux,纯 Go X 协议) | x11 | github.com/go-vgo/robotgo/x11 |
| Wayland(Linux,wlroots) | wayland | github.com/go-vgo/robotgo/wayland |
| libei(Linux,GNOME/KDE portal) | libei | github.com/go-vgo/robotgo/libei |
| 纯 Go 默认(全平台) | purego | 选择上面的mac/win/wayland |
4.2 常用构建命令
# 各平台纯 Go 默认后端,一个标签覆盖所有目标: # macOS -> mac、Windows -> win、Linux -> wayland(可与 x11/libei 组合以覆盖默认) go build -tags purego ./... CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -tags "purego,x11" ./... # Windows,无需 Cgo / MinGW CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -tags win ./... # macOS,运行时经 purego 加载 Quartz/CoreGraphics(无需 Xcode) CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -tags mac ./... # X11,纯 Go X 协议(XTEST)——无需 X11 头文件 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -tags x11 ./... # Wayland,基于 wlroots 的合成器(Sway、Hyprland、Wayfire 等) CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -tags wayland ./... # libei,经 xdg-desktop-portal RemoteDesktop 支持 GNOME/KDE CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -tags libei ./...4.3 构建标签的源码级语义
从仓库源码可以确认各标签的实际行为:
win标签:排除默认的 Cgo/Win32 后端,调用转发至纯 Go 的win包;mac标签:排除默认的 Cgo/Quartz 后端,调用转发至纯 Go 的darwin包(窗口管理返回ErrNotSupported);x11标签:排除 Cgo/X11 后端,调用转发至纯 Go 的x11包;wayland标签:排除 Cgo/X11 后端,调用转发至纯 Go 的wayland包;libei标签:同时排除 Cgo/X11 与 wlroots Wayland 后端,调用转发至纯 Go 的libei包;purego标签:跨平台快捷键——在所有平台排除 Cgo 后端,按目标 OS 选择纯 Go 默认后端(macOS→mac、Windows→win、Linux→wayland);Linux 上可再组合x11或libei(如-tags "purego,libei")改选其他纯 Go 后端。
构建标签的约束在源码中以//go:build行体现,例如 wayland_n.go 的约束为linux && (wayland || purego) && !libei && !x11,其中每个KeyTap、Move、CaptureImg等函数都只是一行转发到wl包的薄封装;默认 Cgo 实现 robotgo.go 则声明!wayland && !win && !libei && !mac && !x11 && !purego。robotgo_pub.go(版本、睡眠、Bitmap/Point/Size/Rect 类型、DisplayID/NotPid/Scale 公共变量)不带任何构建标签,因此所有后端共享同一份公共 API 面。
5. 官方示例全解析(Examples)
以下示例均来自仓库 examples 目录(另有 examples/README.md 与总入口 examples/main.go 可参考),与日文 README 中给出的代码一一对应,并附源码级讲解。
5.1 鼠标控制(Mouse)
完整示例见 examples/mouse/main.go:
package main import ( "fmt" "github.com/go-vgo/robotgo" ) func main() { robotgo.MouseSleep = 300 robotgo.Move(100, 100) fmt.Println(robotgo.Location()) robotgo.Move(100, -200) // 支持多显示器 robotgo.MoveSmooth(120, -150) fmt.Println(robotgo.Location()) robotgo.ScrollDir(10, "up") robotgo.ScrollDir(20, "right") robotgo.Scroll(0, -10) robotgo.Scroll(100, 0) robotgo.MilliSleep(100) robotgo.ScrollSmooth(-10, 6) // robotgo.ScrollRelative(10, -100) robotgo.Move(10, 20) robotgo.MoveRelative(0, -10) robotgo.DragSmooth(10, 10) robotgo.Click("wheelRight") robotgo.Click("left", true) robotgo.MoveSmooth(100, 200, 1.0, 10.0) robotgo.Toggle("left") robotgo.Toggle("left", "up") }源码级要点:
MouseSleep:每次鼠标动作后的默认毫秒级休眠时间,默认值为0(定义于 robotgo_pub.go),示例中设为300让动作节奏更接近真人。Move(x, y):绝对移动。在 Windows 或开启Scale时会先按系统缩放因子换算坐标(见 robotgo.go 的MoveScale),因此注释明确“支持多屏幕”,坐标为负值表示主屏左/上的扩展屏区域。MoveSmooth(x, y, low, high, mouseDelay):拟人化平滑移动。默认low=1.0, high=3.0,底层调用C.smoothlyMoveMouse(见 robotgo.go);示例中MoveSmooth(100, 200, 1.0, 10.0)的第四个参数为鼠标延迟。Click/Toggle:支持的按键名有"left"、"center"、"right"、"wheelDown"、"wheelUp"、"wheelLeft"、"wheelRight"(见 robotgo.go 的CheckMouse映射表)。Click("left", true)为双击;Toggle("left")默认按下,Toggle("left", "up")抬起。DragSmooth(10, 10):等价于“按住左键 → 平滑移动到目标 → 松开左键”,实现见 robotgo.go。MoveRelative(x, y):相对位移,内部先取当前坐标再叠加偏移(见 robotgo_pub.go)。
5.2 键盘输入(Keyboard)
完整示例见 examples/key/main.go:
package main import ( "fmt" "github.com/go-vgo/robotgo" ) func main() { robotgo.Type("Hello World") robotgo.Type("だんしゃり", 0, 1) // robotgo.Type("テストする") robotgo.Type("Hi, Seattle space needle, Golden gate bridge, One world trade center.") robotgo.Type("Hi galaxy, hi stars, hi MT.Rainier, hi sea. こんにちは世界.") robotgo.Sleep(1) // ustr := uint32(robotgo.CharCodeAt("Test", 0)) // robotgo.UnicodeType(ustr) robotgo.KeySleep = 100 robotgo.KeyTap("enter") // robotgo.Type("en") robotgo.KeyTap("i", "alt", "cmd") arr := []string{"alt", "cmd"} robotgo.KeyTap("i", arr) robotgo.MilliSleep(100) robotgo.KeyToggle("a") robotgo.KeyToggle("a", "up") robotgo.WriteAll("Test") text, err := robotgo.ReadAll() if err == nil { fmt.Println(text) } }源码级要点:
Type(str, msDelay, perKeySleep):按字符串逐个输入字符,支持日文假名等多字节文本;Type("だんしゃり", 0, 1)中第二个参数为字符间隔毫秒,第三个参数为每键额外休眠。TypeStr是其别名(见 key.go)。KeyTap(key, mods...):敲击按键。修饰键既可以是可变参数KeyTap("i", "alt", "cmd"),也可以是[]string切片KeyTap("i", arr)。源码 key.go 的appendShift会自动处理:首字母大写或特殊字符(如!、@、#)时自动附加shift,因此robotgo.Type("Hello World")中的大写字母无需手动指定修饰键。KeyToggle(key, "down"/"up"):长按/释放按键,KeyToggle("a")默认按下,KeyToggle("a", "up")释放(见 key.go)。KeySleep:按键后的默认毫秒休眠,默认10(见 robotgo_pub.go)。- 支持的键名:除
a-z、0-9外,还包括enter、tab、esc、方向键、f1-f24、修饰键(cmd/alt/ctrl/shift及其左右变体)、媒体键(audio_mute、audio_vol_up、audio_next等)、小键盘键(num0-num9)等。完整列表见 key.go 的keyNames映射表与 docs/keys.md 文档。 - 剪贴板:
WriteAll("Test")写入系统剪贴板,ReadAll()读取并返回(string, error)。跨平台实现位于 clipboard 包,其中 Linux 依赖第 2 节安装的xsel/xclip。
5.3 屏幕读取与截图(Screen)
完整示例见 examples/screen/main.go:
package main import ( "fmt" "strconv" "github.com/go-vgo/robotgo" "github.com/vcaesar/imgo" ) func main() { x, y := robotgo.Location() fmt.Println("pos: ", x, y) color := robotgo.GetPixelColor(100, 200) fmt.Println("color---- ", color) sx, sy := robotgo.GetScreenSize() fmt.Println("get screen size: ", sx, sy) bit := robotgo.CaptureScreen(10, 10, 30, 30) defer robotgo.FreeBitmap(bit) img := robotgo.ToImage(bit) imgo.Save("test.png", img) num := robotgo.DisplaysNum() for i := 0; i < num; i++ { robotgo.DisplayID = i img1, _ := robotgo.CaptureImg() path1 := "save_" + strconv.Itoa(i) robotgo.Save(img1, path1+".png") robotgo.SaveJpeg(img1, path1+".jpeg", 50) img2, _ := robotgo.CaptureImg(10, 10, 20, 20) robotgo.Save(img2, "test_"+strconv.Itoa(i)+".png") x, y, w, h := robotgo.GetDisplayBounds(i) img3, err := robotgo.CaptureImg(x, y, w, h) fmt.Println("Capture error: ", err) robotgo.Save(img3, path1+"_1.png") } }源码级要点:
CaptureScreen(x, y, w, h):返回 C 结构位图(CBitmap),文档强调必须用defer robotgo.FreeBitmap(bit)释放内存,否则会造成泄漏;释放实现见 robotgo.go。不传参数时默认捕获主屏完整区域(见 robotgo.go)。ToImage(bit):将 C 位图转换为标准image.Image(底层走ToRGBA,见 robotgo.go),之后即可交给imgo、bitmap或标准库处理。GetPixelColor(x, y):返回形如"ff0000"的十六进制颜色字符串(PadHex补足 6 位,见 robotgo.go)。- 多显示器遍历:
DisplaysNum()获取显示器数量;循环中设置全局变量robotgo.DisplayID = i切换目标屏幕(默认-1表示主屏);GetDisplayBounds(i)返回某显示器的(x, y, w, h)边界;CaptureImg()返回(image.Image, error)并在内部自动释放位图(见 robotgo.go)。 - 保存:
Save(img, path)按扩展名自动选择格式,SaveJpeg(img, path, quality)指定 JPEG 质量(示例中为50)。图像编解码与读写由 img.go 基于github.com/vcaesar/imgo提供。
5.4 位图查找(Bitmap)
package main import ( "fmt" "github.com/go-vgo/robotgo" "github.com/vcaesar/bitmap" ) func main() { bit := robotgo.CaptureScreen(10, 20, 30, 40) // 使用 `defer robotgo.FreeBitmap(bit)` 释放位图 defer robotgo.FreeBitmap(bit) fmt.Println("bitmap...", bit) img := robotgo.ToImage(bit) // robotgo.SavePng(img, "test_1.png") robotgo.Save(img, "test_1.png") bit2 := robotgo.ToCBitmap(robotgo.ImgToBitmap(img)) fx, fy := bitmap.Find(bit2) fmt.Println("FindBitmap------ ", fx, fy) robotgo.Move(fx, fy) arr := bitmap.FindAll(bit2) fmt.Println("Find all bitmap: ", arr) fx, fy = bitmap.Find(bit) fmt.Println("FindBitmap------ ", fx, fy) bitmap.Save(bit, "test.png") }源码级要点:
bitmap是独立的第三方库github.com/vcaesar/bitmap(在 go.mod 中作为间接依赖使用场景出现),提供Find(查找首个匹配坐标)、FindAll(返回全部匹配坐标)与Save。robotgo.ImgToBitmap(img)将标准image.Image转成 Go 结构Bitmap,再经ToCBitmap转为 C 位图供bitmap.Find使用;位图类型间的互相转换完整矩阵见 docs/keys.md。- 典型用法是「截屏 → 找图 → 移动到目标坐标」,这正是 RPA / Computer Use 中“视觉定位 + 鼠标操作”的核心闭环。
bitmap查找在纯 C 侧完成,性能敏感场景下应优先复用位图句柄而不是反复截图。
5.5 OpenCV 图像识别(gcv)
package main import ( "fmt" "math/rand" "github.com/go-vgo/robotgo" "github.com/vcaesar/gcv" "github.com/vcaesar/bitmap" ) func main() { opencv() } func opencv() { name := "test.png" name1 := "test_001.png" robotgo.SaveCapture(name1, 10, 10, 30, 30) robotgo.SaveCapture(name) fmt.Print("gcv find image: ") fmt.Println(gcv.FindImgFile(name1, name)) fmt.Println(gcv.FindAllImgFile(name1, name)) bit := bitmap.Open(name1) defer robotgo.FreeBitmap(bit) fmt.Print("find bitmap: ") fmt.Println(bitmap.Find(bit)) // bit0 := robotgo.CaptureScreen() // img := robotgo.ToImage(bit0) // bit1 := robotgo.CaptureScreen(10, 10, 30, 30) // img1 := robotgo.ToImage(bit1) // defer robotgo.FreeBitmapArr(bit0, bit1) img, _ := robotgo.CaptureImg() img1, _ := robotgo.CaptureImg(10, 10, 30, 30) fmt.Print("gcv find image: ") fmt.Println(gcv.FindImg(img1, img)) fmt.Println() res := gcv.FindAllImg(img1, img) fmt.Println(res[0].TopLeft.Y, res[0].Rects.TopLeft.X, res) x, y := res[0].TopLeft.X, res[0].TopLeft.Y robotgo.Move(x, y-rand.Intn(5)) robotgo.MilliSleep(100) robotgo.Click() res = gcv.FindAll(img1, img) // 同时使用模板匹配与 sift fmt.Println("find all: ", res) res1 := gcv.Find(img1, img) fmt.Println("find: ", res1) img2, _, _ := robotgo.DecodeImg("test_001.png") x, y = gcv.FindX(img2, img) fmt.Println(x, y) }源码级要点:
gcv(github.com/vcaesar/gcv)是基于 OpenCV 的图像查找库,支持从文件(FindImgFile/FindAllImgFile)与内存图像(FindImg/FindAllImg/Find)两种入口;FindAll同时使用模板匹配与 SIFT 特征。robotgo.SaveCapture(path, x, y, w, h)一步完成“截屏并保存”(见 robotgo.go),DecodeImg(path)读取图片为image.Image(见 img.go)。- 找到目标坐标后执行
robotgo.Move(x, y-rand.Intn(5))、Click(),实现“识别 → 定位 → 点击”的自动化循环,这也是 AI Computer Use 中最常用的交互模式。
5.6 全局事件监听(Event / gohook)
package main import ( "fmt" // "github.com/go-vgo/robotgo" hook "github.com/robotn/gohook" ) func main() { add() low() event() } func add() { fmt.Println("--- Please press ctrl + shift + q to stop hook ---") hook.Register(hook.KeyDown, []string{"q", "ctrl", "shift"}, func(e hook.Event) { fmt.Println("ctrl-shift-q") hook.End() }) fmt.Println("--- Please press w---") hook.Register(hook.KeyDown, []string{"w"}, func(e hook.Event) { fmt.Println("w") }) s := hook.Start() <-hook.Process(s) } func low() { evChan := hook.Start() defer hook.End() for ev := range evChan { fmt.Println("hook: ", ev) } } func event() { ok := hook.AddEvents("q", "ctrl", "shift") if ok { fmt.Println("add events...") } keve := hook.AddEvent("k") if keve { fmt.Println("you press... ", "k") } mleft := hook.AddEvent("mleft") if mleft { fmt.Println("you press... ", "mouse left button") } }源码级要点:
- 全局事件钩子由独立的
github.com/robotn/gohook库提供,支持按键回调注册(Register)、底层事件流(Start返回 channel)与阻塞式单键监听(AddEvent/AddEvents)三种模式。 add()展示回调模式:注册ctrl+shift+q组合键后调用hook.End()优雅退出;low()展示 channel 模式:for ev := range evChan可拿到每一次底层键盘/鼠标事件;event()展示同步等待模式。- Linux 上该库依赖第 2 节安装的
xcb、xkb、libxkbcommon等系统库(README 中标注为 “Event-Gohook” 专属依赖)。
5.7 窗口与进程(Window)
完整示例见 examples/window/main.go:
package main import ( "fmt" "github.com/go-vgo/robotgo" ) func main() { fpid, err := robotgo.FindIds("Google") if err == nil { fmt.Println("pids... ", fpid) if len(fpid) > 0 { robotgo.Type("Hi galaxy!", fpid[0]) robotgo.KeyTap("a", fpid[0], "cmd") robotgo.KeyToggle("a", fpid[0]) robotgo.KeyToggle("a", fpid[0], "up") robotgo.ActivePid(fpid[0]) robotgo.Kill(fpid[0]) } } robotgo.ActiveName("chrome") isExist, err := robotgo.PidExists(100) if err == nil && isExist { fmt.Println("pid exists is", isExist) robotgo.Kill(100) } abool := robotgo.Alert("test", "robotgo") if abool { fmt.Println("ok@@@ ", "ok") } title := robotgo.GetTitle() fmt.Println("title@@@ ", title) }源码级要点:
- 进程 API:
FindIds(name)按名称(不区分大小写的子串匹配)返回进程 ID 列表,PidExists(pid)判断进程是否存在,Kill(pid)结束进程——这三者的跨平台实现位于 ps.go(基于github.com/vcaesar/gops),在纯 Go 后端中分别由 wayland/process.go、win/process.go、libei/process.go 等提供。此外还有Pids()、FindName(pid)、FindPath(pid)、Run(cmd)等便捷函数(见 ps.go)。 - 向指定进程注入输入:
Type(str, pid)、KeyTap(key, pid, mods...)、KeyToggle(key, pid, ...)都支持将 PID 作为第二参数,实现“后台/定向”输入。注意 Windows 上存在NotPid全局变量(见 robotgo_pub.go),置为true时相关 API 将把该参数解释为窗口句柄(HWND)而非 PID。 - 窗口激活:
ActivePid(pid)激活进程窗口,ActiveName(name)则先FindIds再激活第一个匹配进程(见 robotgo.go 的实现);GetTitle()获取当前前台窗口标题。macOS 与 X11 的窗口激活分别实现在 robotgo_mac_win.go 与 robotgo_x11.go,Windows 侧基于tailscale/win的SetForegroundWindow等 API(见 robotgo_win.go)。 Alert(title, msg, ...buttons):弹出系统级对话框,可传“确定/取消”等按钮文本,返回用户点击结果。
6. 公共变量与调优参数速查
以下全局变量定义于不带构建标签的 robotgo_pub.go,对所有后端生效,是调优 RobotGo 行为的关键入口:
| 变量 | 默认值 | 说明 |
|---|---|---|
MouseSleep | 0 | 鼠标动作后的毫秒休眠,调大可让操作节奏更拟人 |
KeySleep | 10 | 按键动作后的毫秒休眠 |
DisplayID | -1 | 目标显示器 ID(-1为主屏,配合DisplaysNum()/GetDisplayBounds()遍历多屏) |
NotPid | false | Windows 下将 PID 参数解释为窗口句柄(HWND) |
Scale | false | 是否启用屏幕缩放因子换算(Windows 下部分 API 默认按 DPI 换算,见 robotgo_win.go 的ScaleF:f = dpi / 96.0) |
类型系统方面,Bitmap(Go 结构)、CBitmap(C 结构引用)、image.Image之间可自由转换,完整矩阵见 docs/keys.md,常用组合为CaptureScreen → CBitmap、ToImage → image.Image、ImgToBitmap/ToCBitmap → 位图查找。
7. 许可证(License)
RobotGo 主要以Apache License 2.0条款分发,部分代码受多种 BSD 类许可证覆盖。仓库根目录提供 LICENSE 文件,base目录的 C 头文件与各子包文件头部也均带有 Apache 2.0 许可声明(例如 mouse/mouse.go)。在分发或修改代码前请阅读对应许可证文本。
8. 结语:一份 README 背后的完整工程
lang/README.ja.md虽然只是项目多语言 README 之一,但它完整承载了 RobotGo 的「安装前置 → 构建体系 → 七大模块示例」主线。本文在此基础上,将每条命令、每个参数都下沉到了仓库源码(robotgo.go、key.go、img.go、ps.go、robotgo_pub.go、各纯 Go 后端目录)与示例目录(examples)做了逐项印证。对开发者而言,这意味着:在 X11 桌面可直接使用默认 Cgo 后端,在 Sway/Hyprland 上可切-tags wayland,在 GNOME/KDE 上可切-tags libei,而跨平台产物统一使用同一套robotgoAPI——这正是 RobotGo 作为 Go 原生桌面自动化、RPA 与 AI Computer Use 基础设施的核心价值。
- RPA
- GUI 自动化
【免费下载链接】robotgo
RobotGo, Go Native cross-platform RPA, GUI automation, Auto test and Computer use @vcaesar
相关推荐
RobotGo 完全指南:基于 Go 的跨平台桌面自动化、GUI 自动化与 AI Computer Use
RobotGo 完全指南:基于 Go 的跨平台桌面自动化、GUI 自动化与 AI Computer Use RobotGo(RobotGo, Go Native
RPAGUI 自动化RobotGo 跨平台桌面自动化完全指南:环境依赖、无 Cgo 纯 Go 构建与实战示例
RobotGo 跨平台桌面自动化完全指南:环境依赖、无 Cgo 纯 Go 构建与实战示例 本文以仓库 lang/README.de.md https://lin
RPAGUI 自动化RobotGo 跨平台桌面自动化完全指南:环境搭建、Cgo-free 纯 Go 构建与七大实战示例
RobotGo 跨平台桌面自动化完全指南:环境搭建、Cgo free 纯 Go 构建与七大实战示例 本指南以 RobotGo 项目的官方文档( lang/REA
RPAGUI 自动化
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考