golang跨平台剪贴板操作插件库clipboard的使用
Golang跨平台剪贴板操作插件库clipboard的使用
简介
clipboard
是一个跨平台(macOS/Linux/Windows/Android/iOS)的Go语言剪贴板操作库。
import "golang.design/x/clipboard"
特性
- 跨平台支持:macOS、Linux(X11)、Windows、iOS和Android
- 复制/粘贴UTF-8文本
- 复制/粘贴PNG编码的图像(仅限桌面平台)
- 提供命令行工具
gclip
作为演示应用 - 提供移动应用
gclip-gui
作为演示应用
API使用
在使用剪贴板功能前,必须先调用Init()
初始化:
// Init返回错误表示包未准备好使用
err := clipboard.Init()
if err != nil {
panic(err)
}
最常用的操作是Read
和Write
:
// 写入/读取剪贴板的文本格式数据,字节缓冲区为UTF8编码
clipboard.Write(clipboard.FmtText, []byte("text data"))
clipboard.Read(clipboard.FmtText)
// 写入/读取剪贴板的图像格式数据,字节缓冲区为PNG编码
clipboard.Write(clipboard.FmtImage, []byte("image data"))
clipboard.Read(clipboard.FmtImage)
clipboard.Write
返回一个通道,可以接收空结构体作为信号,表示写入剪贴板的数据已被覆盖:
changed := clipboard.Write(clipboard.FmtText, []byte("text data"))
select {
case <-changed:
println(`"text data" is no longer available from clipboard.`)
}
如果需要监控剪贴板变化,可以使用观察者API:
ch := clipboard.Watch(context.TODO(), clipboard.FmtText)
for data := range ch {
// 当剪贴板内容变化时打印数据
println(string(data))
}
完整示例
package main
import (
"context"
"fmt"
"golang.design/x/clipboard"
)
func main() {
// 初始化剪贴板
err := clipboard.Init()
if err != nil {
panic(err)
}
// 写入文本到剪贴板
clipboard.Write(clipboard.FmtText, []byte("Hello, Clipboard!"))
// 从剪贴板读取文本
data := clipboard.Read(clipboard.FmtText)
fmt.Println("Clipboard text:", string(data))
// 监控剪贴板变化
ch := clipboard.Watch(context.TODO(), clipboard.FmtText)
fmt.Println("Watching clipboard changes...")
for data := range ch {
fmt.Println("Clipboard changed to:", string(data))
}
}
命令行工具
安装gclip
命令行工具:
$ go install golang.design/x/clipboard/cmd/gclip@latest
使用示例:
# 从剪贴板粘贴并打印内容
$ gclip -paste
# 从剪贴板粘贴并保存为文本文件
$ gclip -paste -f x.txt
# 从剪贴板粘贴并保存为图片文件
$ gclip -paste -f x.png
# 将文件内容复制到剪贴板
$ cat x.txt | gclip -copy
# 将文本文件内容复制到剪贴板
$ gclip -copy -f x.txt
# 将图片文件作为图像数据复制到剪贴板
$ gclip -copy -f x.png
平台特定细节
依赖
- macOS: 需要Cgo,无其他依赖
- Linux: 需要X11开发包(如libx11-dev、xorg-dev或libX11-devel)
- Windows: 不需要Cgo,无依赖
- iOS/Android: 需要与
gomobile
配合使用
截图
各平台截图到剪贴板的快捷键:
- macOS:
Ctrl+Shift+Cmd+4
- Linux/Ubuntu:
Ctrl+Shift+PrintScreen
- Windows:
Shift+Win+s
许可证
MIT | © 2021 The golang.design Initiative Authors
更多关于golang跨平台剪贴板操作插件库clipboard的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang跨平台剪贴板操作插件库clipboard的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang跨平台剪贴板操作库clipboard使用指南
clipboard
是一个简单易用的Golang跨平台剪贴板操作库,支持Windows、macOS和Linux系统。下面详细介绍其使用方法。
安装
首先安装该库:
go get github.com/atotto/clipboard
基本功能
1. 写入剪贴板
package main
import (
"github.com/atotto/clipboard"
"log"
)
func main() {
// 写入文本到剪贴板
err := clipboard.WriteAll("Hello, Clipboard!")
if err != nil {
log.Fatal(err)
}
log.Println("文本已复制到剪贴板")
}
2. 读取剪贴板
package main
import (
"github.com/atotto/clipboard"
"log"
)
func main() {
// 从剪贴板读取文本
text, err := clipboard.ReadAll()
if err != nil {
log.Fatal(err)
}
log.Printf("剪贴板内容: %s", text)
}
高级用法
1. 监听剪贴板变化
package main
import (
"github.com/atotto/clipboard"
"log"
"time"
)
func main() {
// 获取初始剪贴板内容
lastContent, _ := clipboard.ReadAll()
for {
// 每隔1秒检查剪贴板
time.Sleep(time.Second)
currentContent, err := clipboard.ReadAll()
if err != nil {
log.Printf("读取剪贴板错误: %v", err)
continue
}
if currentContent != lastContent {
log.Printf("剪贴板内容已更改: %s", currentContent)
lastContent = currentContent
}
}
}
2. 多格式剪贴板操作
虽然clipboard
库主要处理文本,但可以通过以下方式处理其他格式:
package main
import (
"bytes"
"github.com/atotto/clipboard"
"image/png"
"os"
)
func writeImageToClipboard() error {
// 读取图片文件
file, err := os.Open("example.png")
if err != nil {
return err
}
defer file.Close()
// 解码PNG图片
img, err := png.Decode(file)
if err != nil {
return err
}
// 将图片编码为字节
var buf bytes.Buffer
if err := png.Encode(&buf, img); err != nil {
return err
}
// 写入剪贴板(注意: clipboard库主要设计用于文本)
// 对于图片等二进制数据,可能需要使用平台特定的API
return clipboard.WriteAll(buf.String())
}
跨平台注意事项
-
Linux依赖:在Linux上需要安装xsel或xclip
# Ubuntu/Debian sudo apt-get install xsel xclip # CentOS/RHEL sudo yum install xsel xclip
-
Windows/macOS:无需额外依赖
-
WSL:在Windows Subsystem for Linux中,可能需要额外配置才能访问Windows剪贴板
实际应用示例
实现一个简单的剪贴板历史记录器
package main
import (
"github.com/atotto/clipboard"
"log"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
// 创建历史记录文件
file, err := os.OpenFile("clipboard_history.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Fatal(err)
}
defer file.Close()
// 设置信号处理,优雅退出
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
// 记录初始内容
lastContent, _ := clipboard.ReadAll()
if lastContent != "" {
file.WriteString(lastContent + "\n---\n")
}
log.Println("开始监控剪贴板... (Ctrl+C退出)")
// 主循环
ticker := time.NewTicker(1 * time.Second)
defer ticker.Stop()
for {
select {
case <-ticker.C:
currentContent, err := clipboard.ReadAll()
if err != nil {
log.Printf("错误: %v", err)
continue
}
if currentContent != lastContent && currentContent != "" {
log.Printf("新内容: %s", currentContent)
file.WriteString(currentContent + "\n---\n")
lastContent = currentContent
}
case <-sigChan:
log.Println("退出程序")
return
}
}
}
替代方案
如果clipboard
库不能满足需求,可以考虑以下替代方案:
- golang.design/x/clipboard - 更现代的剪贴板库,支持更多功能
- srwiley/oksvg - 如果需要处理SVG等特定格式
总结
clipboard
库提供了简单易用的跨平台剪贴板操作接口,适合大多数基本的剪贴板读写需求。对于更复杂的需求,可能需要结合平台特定的API或使用功能更丰富的替代库。
使用时需要注意错误处理,特别是在跨平台环境下,某些操作可能会因为系统配置或权限问题而失败。