news 2026/9/24 4:23:54

RobotGo 日本語 README 完全解读:Go 原生跨平台桌面自动化、RPA 与 AI Computer Use 实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RobotGo 日本語 README 完全解读:Go 原生跨平台桌面自动化、RPA 与 AI Computer Use 实战指南
  • RPA
  • GUI 自动化

【免费下载链接】robotgo

RobotGo, Go Native cross-platform RPA, GUI automation, Auto test and Computer use @vcaesar

项目地址:https://gitcode.com/gh_mirrors/ro/robotgo
点击查看免费下载

本文以仓库内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(版本、睡眠、位图结构、公共变量),而windarwinx11waylandlibei五个子目录则分别承载各平台的纯 Go 实现。

2. 环境依赖(Requirements)

官方文档强调:安装 RobotGo 之前,必须确保Golang 与 GCC已正确安装。不同平台的具体前置条件如下。

2.1 全部平台

Golang GCC

2.2 MacOS

brew install go

同时需要 Xcode 命令行工具:

xcode-select --install

权限配置:在「系统设置 > 隐私与安全 > 辅助功能、屏幕与系统音频录制」中添加「屏幕录制」和「辅助功能」权限,否则屏幕捕获与事件注入会被系统拦截。

2.3 Windows

winget install Golang.go

GCC 工具链可选择以下任一方案:

# 方案一: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-dev
Fedora
# 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)wingithub.com/go-vgo/robotgo/win
macOS(经 purego 调用 Quartz)macgithub.com/go-vgo/robotgo/darwin
X11(Linux,纯 Go X 协议)x11github.com/go-vgo/robotgo/x11
Wayland(Linux,wlroots)waylandgithub.com/go-vgo/robotgo/wayland
libei(Linux,GNOME/KDE portal)libeigithub.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 上可再组合x11libei(如-tags "purego,libei")改选其他纯 Go 后端。

构建标签的约束在源码中以//go:build行体现,例如 wayland_n.go 的约束为linux && (wayland || purego) && !libei && !x11,其中每个KeyTapMoveCaptureImg等函数都只是一行转发到wl包的薄封装;默认 Cgo 实现 robotgo.go 则声明!wayland && !win && !libei && !mac && !x11 && !puregorobotgo_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-z0-9外,还包括entertabesc、方向键、f1-f24、修饰键(cmd/alt/ctrl/shift及其左右变体)、媒体键(audio_muteaudio_vol_upaudio_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),之后即可交给imgobitmap或标准库处理。
  • 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) }

源码级要点

  • gcvgithub.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 节安装的xcbxkblibxkbcommon等系统库(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) }

源码级要点

  • 进程 APIFindIds(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/winSetForegroundWindow等 API(见 robotgo_win.go)。
  • Alert(title, msg, ...buttons):弹出系统级对话框,可传“确定/取消”等按钮文本,返回用户点击结果。

6. 公共变量与调优参数速查

以下全局变量定义于不带构建标签的 robotgo_pub.go,对所有后端生效,是调优 RobotGo 行为的关键入口:

变量默认值说明
MouseSleep0鼠标动作后的毫秒休眠,调大可让操作节奏更拟人
KeySleep10按键动作后的毫秒休眠
DisplayID-1目标显示器 ID(-1为主屏,配合DisplaysNum()/GetDisplayBounds()遍历多屏)
NotPidfalseWindows 下将 PID 参数解释为窗口句柄(HWND)
Scalefalse是否启用屏幕缩放因子换算(Windows 下部分 API 默认按 DPI 换算,见 robotgo_win.go 的ScaleFf = dpi / 96.0

类型系统方面,Bitmap(Go 结构)、CBitmap(C 结构引用)、image.Image之间可自由转换,完整矩阵见 docs/keys.md,常用组合为CaptureScreen → CBitmapToImage → image.ImageImgToBitmap/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.gokey.goimg.gops.gorobotgo_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

项目地址:https://gitcode.com/gh_mirrors/ro/robotgo
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 4:23:52

Hi3798MV310机顶盒刷机实战:从当贝桌面定制到安卓终端重生

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/24 4:23:18

鼎芯微碳化硅控制IC:重构电源架构的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/24 4:23:16

人声分离工具怎么选

选择人声分离工具&#xff0c;核心是匹配你的分离目标和素材条件——不同工具对复杂混音频谱的分离精度不同&#xff0c;对原始素材的质量要求也有差异。你可以先明确自己需要保留什么、分离后用来做什么&#xff0c;再根据素材质量验证分离效果&#xff0c;最后选择符合精度要…

作者头像 李华
网站建设 2026/9/24 4:18:06

STM32 FOC中Y/Δ接法对SVPWM扇区判断与矢量合成的影响

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/24 4:10:28

K3s 详解:轻量级 Kubernetes 的架构、部署、局限性与应用场景

K3s 详解&#xff1a;轻量级 Kubernetes 的架构、部署、局限性与应用场景摘要&#xff1a;K3s 是面向边缘计算、资源受限环境、开发测试和中小规模生产集群的轻量级 Kubernetes 发行版。它保留 Kubernetes 的核心 API 和编排能力&#xff0c;同时简化安装并内置常用组件。本文系…

作者头像 李华
网站建设 2026/9/24 4:10:03

量化回测工具选型指南:QMT、PTrade与开源框架对比

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华