
RobotGo 剪贴板操作指南跨平台 Clipboard 读写原理与 gocopy/gopaste 实战【免费下载链接】robotgoRobotGo, Go Native cross-platform RPA, GUI automation, Auto test and Computer use vcaesar项目地址: https://gitcode.com/gh_mirrors/ro/robotgo导读RobotGo 仓库中的clipboard子包为 Go 程序提供了跨平台Windows / macOS / Linux/Unix的剪贴板文本读写能力并附带gocopy、gopaste两个可直接使用的命令行工具是 GUI 自动化如复制文本后模拟CtrlV粘贴的重要基础组件。本文基于 clipboard/README.md 展开结合仓库源码与测试讲解其平台实现原理、API 用法、命令行操作与常见注意事项读完即可在自己的 Go 程序或 Shell 脚本中完成剪贴板读写。clipboard 子包是什么clipboard目录是一个以 atotto/clipboard// ReadAll read string from clipboard func ReadAll() (string, error) { return readAll() } // WriteAll write string to clipboard func WriteAll(text string) error { return writeAll(text) } // Unsupported might be set true during clipboard init, // to help callers decide whether or not to // offer clipboard options. var Unsupported bool核心接口只有两个函数和一个包级布尔变量ReadAll() (string, error)从剪贴板读取当前文本内容WriteAll(text string) error把字符串写入剪贴板Unsupported在包初始化init()阶段置位若当前环境没有可用的剪贴板后端如 Linux 下既无xclip也无xsel则为true调用方可以据此判断是否向用户提供剪贴板功能。上层 API 同时被 RobotGo 根包重新导出见 robotgo_pub.go顶层robotgo.ReadAll()与robotgo.WriteAll()直接委托给 clipboard 包实现方便统一调用。平台支持与底层实现原理README 声明的支持平台为OSXmacOS通过系统自带的pbpaste/pbcopy命令实现Windows 7大概率兼容其他 Windows 版本通过 Win32 API 实现Linux / Unix需要系统预装xclip或xsel命令行工具。macOSpbcopy / pbpaste实现位于 clipboard/clipboard_darwin.go通过os/exec调用系统命令读取pbpaste的标准输出即剪贴板文本写入把字符串写入pbcopy的标准输入。darwin版本没有Unsupported判定逻辑因为 macOS 上这两个命令由系统自带几乎总是可用。WindowsWin32 剪贴板 API实现位于 clipboard/clipboard_windows.go通过syscall直接调用user32.dll与kernel32.dllOpenClipboard/CloseClipboard打开、关闭剪贴板EmptyClipboard清空剪贴板GlobalAlloc(GMEM_MOVEABLE, ...)、GlobalLock、GlobalUnlock、lstrcpyW分配并填充全局内存SetClipboardData(CF_UNICODETEXT, h)/GetClipboardData(CF_UNICODETEXT)读写UnicodeUTF-16文本cfUnicodetext 13。值得注意的细节写入时分配的内存必须带GMEM_MOVEABLE0x0002标志这与 Win32 文档要求一致成功后把句柄置 0 以抑制 defer 中的GlobalFree清理避免重复释放源码注释suppress deferred cleanupwaitOpenClipboard()在剪贴板被其他进程占用时会最多等待约 1 秒循环中每次time.Sleep(time.Millisecond)超时返回错误避免直接失败读取时用syscall.UTF16ToString把 UTF-16 缓冲转为 Go 字符串。Linux / Unixxclip 或 xsel实现位于 clipboard/clipboard_unix.go构建标签为freebsd || linux || netbsd || openbsd || solaris || dragonfly。初始化顺序如下默认使用xclip参数xclip -in -selection clipboard写入、xclip -out -selection clipboard读取用exec.LookPath(xclip)检测xclip是否在 PATH 中存在则直接使用否则改用xselxsel --input --clipboard写入、xsel --output --clipboard读取两者都找不到时把包级变量Unsupported置为true。因此在 Linux 服务器或精简桌面环境如无 X 剪贴板工具的容器中运行前需要先安装二者之一例如# Debian / Ubuntu sudo apt-get install xclip # 或 sudo apt-get install xsel # RHEL / CentOS / Fedora sudo yum install xclip此外Unix 实现还提供了一个包级开关Primary bool置为true后会去掉命令参数中的--clipboard/-selection clipboard转而读写 X11 的PRIMARY主选择区而不是 CLIPBOARD 剪贴板。该特性也记录在 docs/CHANGELOG.mdAdd clipboard choose primary mode on unix。当Unsupported true时ReadAll/WriteAll会直接返回errMissingCommandsNo clipboard utilities available. Please install xsel or xclip。使用限制仅文本、仅 UTF-8README 明确列出两条硬性限制Text string only只支持纯文本不支持图片、富文本、文件等剪贴板数据类型UTF-8 text encoding only (no conversion)只按 UTF-8 处理不做编码转换。这意味着如果你的程序输入是 GBK 等其他编码的字符串需要先自行转为 UTF-8 再调用WriteAll读取时拿到的也是 UTF-8 字符串Windows 端内部用 UTF-16 与系统交互但对外统一转成 UTF-8 字符串返回。测试代码 clipboard/clipboard_test.go 对这一点做了充分验证用例覆盖日语日本語、法语字符French: éèêëàùœç以及 emoji☃写入后再读出并要求完全一致。注意该测试文件构建标签为darwin || windowsLinux 上不会参与编译因为测试依赖系统剪贴板环境。在 Go 程序中使用安装README 给出的原始方式$ go get github.com/atotto/clipboard在 RobotGo 仓库内可以直接导入本地子包import github.com/go-vgo/robotgo/clipboard func main() { // 写入剪贴板 err : clipboard.WriteAll(Hello, RobotGo) if err ! nil { panic(err) } // 读取剪贴板 text, err : clipboard.ReadAll() if err ! nil { panic(err) } println(text) }仓库自带完整可运行示例 clipboard/example/example.go演示了写入 → 读取 → 校验非空的完整流程并把错误通过log输出而不是直接忽略err : clipboard.WriteAll(日本語) if err ! nil { log.Println(clipboard write all error: , err) } text, err : clipboard.ReadAll() if err ! nil { log.Println(clipboard read all error: , err) return } if text ! { log.Println(text is: , text) }在 RobotGo 上层还可以直接用根包 APIrobotgo_pub.gorobotgo.ReadAll()读取剪贴板文本robotgo.WriteAll(text)写入文本robotgo.Paste(str)先写入剪贴板再自动按下cmd v在 Windows/Linux 上映射为CtrlV实现编程式粘贴这是 GUI 自动化里最常见的组合用法robotgo.PasteStr(str)已标记 Deprecated建议改用Paste()。命令行工具gocopy 与 gopasteREADME 提供了两个可直接从 Shell 调用的命令分别对应复制与粘贴非常适合在脚本里使用。gopaste把剪贴板内容输出到标准输出$ go get github.com/atotto/clipboard/cmd/gopaste $ # example: $ gopaste document.txt实现见 clipboard/cmd/gopaste/gopaste.go调用clipboard.ReadAll()读回剪贴板文本再用fmt.Print(text)打印到标准输出。因此gopaste document.txt等价于把当前剪贴板内容存成文件也可直接作为管道上游使用。gocopy从标准输入读入并写入剪贴板$ go get github.com/atotto/clipboard/cmd/gocopy $ # example: $ cat document.txt | gocopy实现见 clipboard/cmd/gocopy/gocopy.go先用io.ReadAll(os.Stdin)读尽标准输入再调用clipboard.WriteAll(string(out))写入剪贴板。因此cat document.txt | gocopy等价于把文件内容放进剪贴板配合管道还可以做任意文本处理后再复制例如# 把命令输出复制进剪贴板 df -h | gocopy # 从剪贴板取数并处理 gopaste | grep keyword两个命令的错误处理都很直接出错时panic(err)便于脚本在异常时得到非零退出与明确报错。另外在 RobotGo 仓库内也可以用相对路径方式运行这些命令go run clipboard/cmd/gopaste/gopaste.go go run clipboard/cmd/gocopy/gocopy.go测试与性能基准clipboard/clipboard_test.go 中除了功能用例还包含两个基准测试BenchmarkReadAll反复读取剪贴板测量读性能BenchmarkWriteAll以日语文本いろはにほへと反复写入测量写性能。可以用标准方式运行需要darwin或windows环境go test -bench. ./clipboard由于读写底层都会 fork 系统命令macOS 的 pbcopy/pbpaste或调用 Win32 API基准数据会受系统剪贴板状态与进程调度影响更适合作为相对参考而非精确性能指标。从 CHANGELOG 还可以看到该包在历次迭代中修复过 Windows 剪贴板内存泄漏Fix windows clipboard memory leak、完善过错误处理update clipboard error hand并加入 primary mode说明这一定位于基础组件的小包也经历了持续打磨。注意事项与最佳实践Linux 环境先装依赖未安装xclip/xsel时Unsupported会被置位读写会返回errMissingCommands。调用方应优先检查该布尔值并给出友好提示。编码问题只支持 UTF-8其他编码必须先转换Windows 端内部虽用 UTF-16 交互但对外 API 仍是 UTF-8 字符串无自动转换。剪贴板占用Windows 实现内部已做最多约 1 秒的重试等待其他平台由系统命令负责一般无需额外处理。只处理文本无法读写图片或文件格式需要这类能力时应使用 RobotGo 的位图img.go相关 API等其他手段。配合自动化在 RPA / GUI 自动化场景中robotgo.Paste(str)写剪贴板 触发粘贴快捷键是最常用组合而robotgo.ReadAll()则常用于粘贴后回读结果做断言。总结RobotGo 的clipboard子包以极小的 API 面ReadAll/WriteAll/Unsupported屏蔽了三大平台的剪贴板差异macOS 依赖pbcopy/pbpasteWindows 走 Win32 APILinux/Unix 则基于xclip或xsel命令。配合gocopy/gopaste两个命令行工具无论是 Go 代码内复制粘贴、Shell 管道处理还是与robotgo.Paste组合完成自动化输入都能开箱即用。使用前请务必确认平台依赖尤其 Linux与 UTF-8 编码前提这是避免踩坑的关键。【免费下载链接】robotgoRobotGo, Go Native cross-platform RPA, GUI automation, Auto test and Computer use vcaesar项目地址: https://gitcode.com/gh_mirrors/ro/robotgo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考