news 2026/9/24 10:17:11

RobotGo 跨平台桌面自动化实战指南:从环境搭建、无 Cgo 纯 Go 构建到鼠标键盘与屏幕自动化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RobotGo 跨平台桌面自动化实战指南:从环境搭建、无 Cgo 纯 Go 构建到鼠标键盘与屏幕自动化
  • RPA
  • GUI 自动化

【免费下载链接】robotgo

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

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

RobotGo 是一个用 Go 编写的原生跨平台桌面自动化(RPA)库,同时可用于自动化测试与 AI Computer Use(计算机操作)场景。它以统一的robotgoAPI 控制鼠标、键盘,读取屏幕、进程、窗口句柄、图像与位图,并提供全局事件监听;支持 Mac、Windows 与 Linux,兼容 arm64 与 x86-amd64 架构。本文以仓库内 lang/README.es.md(西班牙语说明文档)为主线,结合 go.mod、robotgo.go、robotgo_pub.go 及各纯 Go 后端源码,完整覆盖从依赖安装、无 Cgo 交叉编译到七大实战示例(鼠标、键盘、屏幕、位图、OpenCV、事件、窗口)的全部细节,读完即可上手编写可运行的桌面自动化程序。

RobotGo 是什么

RobotGo 的核心定位是「Golang 桌面自动化、自动测试以及 AI 计算机操作(Computer Use)」。它把桌面自动化所需的底层系统调用封装成一组统一的 Go API,开发者无需关心平台差异即可:

  • 控制鼠标(移动、点击、拖拽、滚动)
  • 控制键盘(按键、组合键、输入文本)
  • 读取屏幕(截屏、取色、多显示器)
  • 操作进程与窗口句柄(查找、激活、关闭、结束进程)
  • 处理图像与位图(捕获、保存、模板查找)
  • 监听全局键盘/鼠标事件(hook)

从源码结构看,项目同时维护着两套并行的后端体系:一套是默认的 Cgo 后端(robotgo.go 中通过#cgo指令链接平台原生库,如 Linux 的-lX11 -lXtst、Windows 的-lgdi32 -luser32、macOS 的 Cocoa/CoreFoundation/IOKit 框架),另一套是本文重点讲解的纯 Go(无 Cgo)后端,通过构建标签切换(详见 x11_n.go、wayland_n.go、windows_n.go、libei.go)。

环境要求(Requirements)

在安装 RobotGo 之前,必须确保GolangGCC已正确安装。文档给出了各平台的完整安装路径。

通用要求(全部平台)

Golang GCC

macOS

通过 Homebrew 安装 Go:

brew install go

安装 Xcode 命令行工具:

xcode-select --install

另外,必须在系统隐私设置中为运行 RobotGo 的程序授予权限,位置为:系统设置 > 隐私与安全性 > 辅助功能、屏幕与系统音频录制。这一点与 darwin 包 源码中的说明完全一致:大多数输入与屏幕捕获 API 在未授予「辅助功能」与「屏幕录制」权限时只会静默失败(或返回空结果)。

Windows

安装 Go:

winget install Golang.go

安装 llvm-mingw(推荐工具链之一):

winget install MartinStorsjo.LLVM-MinGW.UCRT

或者使用 Mingw-w64:

winget install BrechtSanders.WinLibs.POSIX.UCRT

也可以手动下载 Mingw-w64 及其他 GCC 发行版,然后把类似C:\mingw64\bin的路径配置到系统环境变量Path中。需要特别注意的是:除 Mingw-w64 之外的其他 GCC,在使用bitmap(位图查找)功能时需要自行编译libpng

Linux(X11 桌面)

Linux 下的依赖分为四组,分别对应不同功能模块:

GCC 带 XTest 扩展的 X11(即 Xtst 库) “剪贴板”:xsel xclip “位图”:libpng(仅 “bitmap” 使用。) “事件-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 / RHEL 系
# 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)

Wayland:纯 Go 后端,无需系统 C 库

Wayland 后端是**纯 Go(无 Cgo)**实现,因此不需要任何系统 C 库。但它要求运行在基于 wlroots 的合成器(compositor)上,例如 Sway、Hyprland、Wayfire 等,并且合成器必须支持以下协议:

zwlr_virtual_pointer_v1 (鼠标控制) zwp_virtual_keyboard_v1 (键盘控制) zwlr_screencopy_v1 (屏幕捕获) zwlr_foreign_toplevel_management_v1 (窗口管理)

这一要求在 wayland/doc.go 的包注释中有完全一致的记载。需要注意:GNOME 和 KDE 不原生支持这些协议

libei(GNOME / KDE 桌面)

libei 后端同样是**纯 Go(无 Cgo)**实现,但它的工作方式不同:它通过 freedesktop 的xdg-desktop-portalRemoteDesktop 接口(走 D-Bus)驱动输入,因此可以在 GNOME 和 KDE 上工作(这与依赖 wlroots 协议的 Wayland 后端形成互补)。运行时要求:

xdg-desktop-portal (portal D-Bus 服务) xdg-desktop-portal-gnome / -kde (你桌面的 portal 后端)

关于 libei 后端的更多实现细节,libei/doc.go 补充了几点关键信息:

  • 需要会话级 D-Bus 总线(DBUS_SESSION_BUS_ADDRESS);
  • 首次运行会弹出一致的「允许远程控制」授权对话框;恢复令牌(persist_mode = persistent)会被缓存到$XDG_STATE_HOME/robotgo,后续运行不再重复询问;
  • 支持键盘、相对指针移动、按键与滚动;绝对指针移动(Move)尚未接线,会退化为尽力而为的相对移动;
  • libei 后端只处理鼠标和键盘输入,屏幕捕获和窗口管理会返回ErrNotSupported

安装与更新(Installation / Update)

在支持 Go Module 的环境(Go 1.11+)中,只需要在代码中 import 即可:

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

否则,运行以下命令安装 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 开发头文件缺失,请按上文 Linux/Windows 的 bitmap 依赖说明补齐。

仓库的 go.mod 显示当前模块为github.com/go-vgo/robotgo,Go 版本要求为 1.25.0,纯 Go 后端依赖包括github.com/ebitengine/purego(macOS 运行时动态加载 Quartz/CoreGraphics)、github.com/jezek/xgbgithub.com/jezek/xgbutil(X11 纯 Go 协议实现)、github.com/vcaesar/go-wayland(Wayland 协议)、github.com/tailscale/win(Windows API)以及github.com/godbus/dbus/v5(libei 的 portal D-Bus 通信)等。

无 Cgo 纯 Go 构建(Cgo-free Builds)

这是本仓库最新引入的重要能力:RobotGo 为 Windows、macOS、X11、Wayland 和 libei(Linux)提供了纯 Go(无 Cgo)后端,当前标记为实验性功能。它们暴露与 Cgo 后端完全相同robotgoAPI,因此你的业务代码无需任何改动——只需切换一个构建标签。这些后端可以在CGO_ENABLED=0下交叉编译,完全不需要 GCC、MinGW、Xcode 或 X11 头文件。

后端与构建标签对照表

后端构建标签Go 包
Windows(无 Cgo)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

构建命令示例

# 每个平台的纯 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 ./...

各标签背后的源码机制

这些标签的转发机制在仓库源码中有清晰的实现,全部采用 Go 构建约束(build constraints)控制编译单元,转发层保持 API 签名不变:

  • win标签:默认的 Cgo/Win32 后端被排除,调用转发到纯 Go 的win包。接线代码见 windows_n.go(//go:build windows && (win || purego))。
  • mac标签:默认的 Cgo/Quartz 后端被排除,调用转发到纯 Go 的darwin包;由于纯 Go 实现无法调用需要 Objective-C 的 AppKit 窗口 API,窗口管理返回ErrNotSupported(见 darwin/doc.go)。
  • x11标签:Cgo/X11 后端被排除,调用转发到纯 Go 的x11包(x11_n.go,//go:build linux && x11)。该后端通过github.com/jezek/xgb直接与 X server 走线上协议通信:XTEST 负责输入注入,core protocol 负责截屏与指针查询,窗口管理走 EWMH/ICCCM(github.com/jezek/xgbutil)。
  • wayland标签:Cgo/X11 后端被排除,调用转发到纯 Go 的wayland包(wayland_n.go,//go:build linux && (wayland || purego) && !libei && !x11)。
  • libei标签:Cgo/X11 与 wlroots Wayland 后端均被排除,调用转发到纯 Go 的libei包(libei.go,//go:build linux && libei)。

purego标签:跨平台快捷方式

purego标签是一个跨平台快捷方式:它会在所有平台排除 Cgo 后端,并按目标 OS 选择默认纯 Go 后端——macOS 使用mac,Windows 使用win,Linux 使用wayland。在 Linux 上,你可以将它与x11libei组合(例如-tags "purego,libei")以选择不同的纯 Go 后端。

值得补充的是,各转发层都只重新导出平台相关的符号,而与后端无关的通用代码(img.go 的图像保存、ps.go 的进程管理、keycode.go 的键码转换、screen.go 的部分屏幕辅助函数)以及共享 API 表面(VersionSleepMilliSleepBitmap/Point/Size/Rect类型、DisplayID/NotPid/Scale可调参数)都放在无构建标签约束的 robotgo_pub.go 中,为所有后端共同编译,保证行为一致。

实战示例(Examples)

以下示例全部来自仓库 examples 目录,可直接复制运行(请先按上文完成环境准备)。示例代码还依赖若干辅助包(如github.com/vcaesar/imgogithub.com/vcaesar/bitmapgithub.com/vcaesar/gcvgithub.com/robotn/gohook),它们会随go get一并拉取。

鼠标控制

完整源码见 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) // multi screen supported 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") }

结合 robotgo.go 的实现细节,可以对关键 API 有更准确的理解:

  • robotgo.MouseSleep = 300:设置鼠标操作的默认毫秒延迟(robotgo_pub.go 中MouseSleep的默认值为 0)。Move在完成底层moveMouse调用后会MilliSleep(MouseSleep)
  • Move(x, y):绝对移动鼠标;注释标明支持多显示器(坐标可为负值,例如Move(100, -200))。在 Windows 或开启Scale时,坐标会先乘以系统缩放因子(见MoveScale)。
  • MoveSmooth(x, y, low, high, mouseDelay):拟人化平滑移动。smoothMove中默认low=1.0, high=3.0,第三个参数为鼠标延迟。
  • Click(button, double)CheckMouse支持的按钮名包括"left""center""right""wheelDown""wheelUp""wheelLeft""wheelRight",未匹配时默认回退到左键。
  • Toggle(button, "up"/"down"):按下或释放按键,默认按下;DragSmooth内部就是「左键按下 → 平滑移动 → 左键释放」的组合。

键盘输入

完整源码见 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, delay, keyDelay):模拟键盘逐个键入字符串,支持多语言文本(示例中包含了日文假名)。第二个参数0是字符间隔毫秒数,第三个参数1是按键间隔毫秒数。
  • KeySleep = 100:设置键盘默认毫秒延迟,默认值为 10(见 robotgo_pub.go)。
  • KeyTap(key, mods...):敲击按键,后面的参数是修饰键组合,例如KeyTap("i", "alt", "cmd")等价于同时按下 Alt+Command+i;也支持以[]string切片传入修饰键。
  • KeyToggle(key, "up"):按住或释放按键。
  • WriteAll/ReadAll:写入/读取系统剪贴板文本(对应仓库中的 clipboard 包,Linux 下依赖xsel/xclip)。

屏幕捕获与多显示器

完整源码见 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") } }

屏幕 API 的底层实现要点(见 robotgo.go 第 205-307 行附近):

  • GetPixelColor(x, y):返回指定坐标的像素颜色字符串(内部先取C.MMRGBHex,再经pad_hex补齐为 6 位十六进制)。
  • CaptureScreen(x, y, w, h):截取屏幕指定区域,返回 C 位图(CBitmap),必须用defer robotgo.FreeBitmap(bit)释放;不传参数时截取主显示器全屏。源码中capture_screen的第 5 个参数是显示器 ID,第 6 个参数控制是否按进程窗口捕获(配合NotPid)。
  • CaptureImg():返回标准库image.Image,内部会自动释放临时位图。
  • DisplaysNum()/GetDisplayBounds(i):枚举显示器数量与每块显示器的边界;通过设置全局robotgo.DisplayID = i可切换目标显示器。
  • Save(img, path)/SaveJpeg(img, path, quality):分别保存 PNG / JPEG 截图,JPEG 的第三个参数为压缩质量(示例中为 50)。

位图查找(Bitmap)

位图查找用于「在屏幕上找到某张图片」,是 GUI 自动化定位按钮/图标的核心能力。完整源码见 bitmap 示例:

package main import ( "fmt" "github.com/go-vgo/robotgo" "github.com/vcaesar/bitmap" ) func main() { bit := robotgo.CaptureScreen(10, 20, 30, 40) // use `defer robotgo.FreeBitmap(bit)` to free the bitmap 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") }

流程拆解:CaptureScreen截取屏幕区域得到 C 位图 →ToImage转为标准image.ImageImgToBitmap转回 Go 位图 →ToCBitmap再转回 C 位图用于查找 →bitmap.Find/bitmap.FindAll返回目标在屏幕上的坐标,随后即可用robotgo.Move移动鼠标过去。

OpenCV 图像识别(gcv)

如果要处理更复杂的图像匹配(模板匹配、SIFT 特征匹配),可以结合github.com/vcaesar/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) // use find template and 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) }

要点:SaveCapture直接把截屏存为文件;gcv.FindImgFile/gcv.FindAllImgFile直接在图片文件之间做模板匹配;gcv.Find/gcv.FindAll同时使用模板匹配与 SIFT 特征;识别到目标坐标后,示例演示了「移动鼠标到目标 → 短暂停顿 → 点击」的完整自动化闭环,这正是 RPA 与 AI Computer Use 中最常见的「看图操作」模式。

全局事件监听(Event Hook)

监听全局键盘/鼠标事件需要独立的github.com/robotn/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") } }

三种用法分别对应:Register+Process回调式事件注册(按下 ctrl+shift+q 结束监听)、Start返回事件通道的低级事件流、以及AddEvent/AddEvents阻塞式按键等待。Linux 下 hook 依赖xcbxkblibxkbcommon系列库,对应仓库中 event 目录 下的 C 头文件(android/ios 版本为独立实现)。

窗口与进程管理

完整源码见 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):按进程名(窗口名)查找 PID 列表。
  • Type(str, pid)/KeyTap(key, pid, mods)向指定 PID 的窗口发送输入,无需先激活窗口。
  • ActivePid(pid)/ActiveName(name):激活指定进程/名称的窗口。
  • PidExists(pid):判断进程是否存在。
  • Kill(pid):结束进程。
  • Alert(title, msg):弹出一个原生对话框,返回用户点击结果。
  • GetTitle():读取当前活动窗口的标题。

进程相关 API(PidsProcessKill等)在纯 Go 后端中由跨平台通用的 ps.go 提供,因此无论选择哪个后端,进程管理能力保持一致。

文档、类型转换与交叉编译

  • 按键名与类型转换robotgo.TypeKeyTap接受的按键名称、Bitmap/CBitmap/CHex等类型之间的转换方法,集中记录在 docs/keys.md,其中包含 Type 类型转换对照表与完整按键名列表(keycode.go 提供了键码映射)。
  • 交叉编译:Linux 上交叉编译 Windows/macOS 目标程序的方法见 docs/install.md 的 Cross Compiling 一节;结合本文的无 Cgo 构建标签,CGO_ENABLED=0交叉编译会更加顺畅。
  • API 文档:docs/doc.md 为旧的 API 文档,官方标注已弃用、不再更新,建议以 GoDoc 与当前源码为准。

项目现状与后续计划

文档还提及了项目周边的生态信息:

  • 作者正在打造一个简单易用的 AI Agent(智能体)工作系统 Codg,定位为自动化、异步、并发、高效且高准确度,与 RobotGo 的 AI Computer Use 方向契合。
  • RobotGo-Pro 提供 JavaScript、Python、Lua 等其他语言版本,以及技术支持、新功能与最新版本(目前无开源版本)。
  • Android adb 相关能力可通过 ADB 绑定封装使用。

文档列出的后续开发计划(Plans)包括:将部分 C 代码重构为 Go(例如 x11、windows)、更好的多屏支持、Wayland 支持、更新窗口句柄、尝试支持 Android 与 iOS。从仓库现状看,其中「C 代码重构为 Go」「Wayland 支持」已经落地为本文介绍的纯 Go 后端体系,多屏与 Android/iOS 仍在演进中。

贡献与许可证

  • 贡献者完整列表见项目的 Contributors 页面,参与开发请遵循 CONTRIBUTING.md 中的贡献指南。
  • 许可证:RobotGo 主要依据 Apache License(Version 2.0)条款分发,部分内容受各类 BSD 风格许可证约束,详见 LICENSE 与仓库根目录的 LICENSE 声明。

总结

通过本文,你可以完成从零搭建 RobotGo 开发环境(macOS/Windows/Ubuntu/Fedora/Wayland/libei 全覆盖)、掌握无 Cgo 纯 Go 后端的构建标签矩阵与交叉编译方法,并直接复用仓库 examples 中七大实战示例快速构建自己的桌面自动化、自动测试或 AI Computer Use 应用。无论是传统 X11 桌面还是 wlroots/GNOME/KDE 的 Wayland 环境,RobotGo 都提供了对应的后端接入方案,而统一的robotgoAPI 保证了业务代码的跨平台可移植性。

  • 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 10:15:49

排名靠前的免费云盘平台 高实用性个人存储工具精选

免费云盘平台排名参考维度说明本次免费云盘平台精选的中立性原则说明本次精选仅基于当前各平台公开可验证的事实信息呈现&#xff0c;不做无依据的综合排名&#xff0c;所有内容仅为用户选型提供参考&#xff0c;不构成任何使用推荐。当前市场中的各类云盘排行榜多基于不同评估…

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

电力监控网络安全态势感知架构设计与实战落地指南

/* 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 10:05:40

【Springboot毕设全套源码+文档】基于Java+spring boot的食品安全监测及风险预警系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

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

为什么 AI 写前端时,总是优先选择 React,而不是 Vue?

如果你在过去几个月里&#xff0c;高强度使用过 Codex、Cursor 或者是 Claude Code 等 AI 编程工具&#xff0c;你一定会察觉到一个让国内前端开发者极度不适的现象&#xff1a;当你扔给 AI 一张设计图&#xff0c;或者一段自然语言需求&#xff0c;让它帮你生成前端组件时&…

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

FreeMaster Recorder嵌入式运行时数据采集原理与实战

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

作者头像 李华