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)
}

最常用的操作是ReadWrite

// 写入/读取剪贴板的文本格式数据,字节缓冲区为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

1 回复

更多关于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())
}

跨平台注意事项

  1. Linux依赖:在Linux上需要安装xsel或xclip

    # Ubuntu/Debian
    sudo apt-get install xsel xclip
    
    # CentOS/RHEL
    sudo yum install xsel xclip
    
  2. Windows/macOS:无需额外依赖

  3. 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库不能满足需求,可以考虑以下替代方案:

  1. golang.design/x/clipboard - 更现代的剪贴板库,支持更多功能
  2. srwiley/oksvg - 如果需要处理SVG等特定格式

总结

clipboard库提供了简单易用的跨平台剪贴板操作接口,适合大多数基本的剪贴板读写需求。对于更复杂的需求,可能需要结合平台特定的API或使用功能更丰富的替代库。

使用时需要注意错误处理,特别是在跨平台环境下,某些操作可能会因为系统配置或权限问题而失败。

回到顶部