Golang监听系统剪切板变化事件

如何在Golang中监听系统剪切板的变化事件?我想实现一个功能,当用户复制新内容到剪切板时,程序能自动捕获并处理这些内容。目前尝试了github.com/atotto/clipboard库,但发现它只能读取和写入剪切板,没有提供监听变化的功能。请问有没有成熟的库或方法可以实现这个需求?最好能支持跨平台(Windows/macOS/Linux)。

2 回复

在Golang中监听系统剪切板变化,可以使用github.com/atotto/clipboard库配合轮询机制实现:

package main

import (
    "time"
    "github.com/atotto/clipboard"
)

func main() {
    lastContent := ""
    
    for {
        currentContent, _ := clipboard.ReadAll()
        
        if currentContent != lastContent && currentContent != "" {
            println("剪切板内容变化:", currentContent)
            lastContent = currentContent
        }
        
        time.Sleep(500 * time.Millisecond) // 每500ms检查一次
    }
}

实现要点:

  1. 使用clipboard.ReadAll()读取剪切板内容
  2. 通过比较前后内容检测变化
  3. 设置适当的轮询间隔(如500ms)
  4. 注意处理读取错误情况

限制:

  • 这是轮询方案,非真正的系统事件
  • 不同平台的剪切板实现有差异
  • 需要处理并发访问问题

替代方案可考虑使用CGo调用系统原生API,但会牺牲跨平台兼容性。

更多关于Golang监听系统剪切板变化事件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中监听系统剪切板变化,可以使用第三方库github.com/atotto/clipboard配合文件监听或轮询机制实现。由于不同操作系统的剪切板API不同,这里提供一个跨平台的解决方案:

package main

import (
    "fmt"
    "time"
    "github.com/atotto/clipboard"
)

func main() {
    // 保存上一次的剪切板内容
    lastClipboard := ""
    
    for {
        current, err := clipboard.ReadAll()
        if err != nil {
            fmt.Printf("读取剪切板失败: %v\n", err)
            continue
        }
        
        // 检测内容变化
        if current != lastClipboard && current != "" {
            fmt.Printf("剪切板内容变化: %s\n", current)
            lastClipboard = current
        }
        
        // 每秒检查一次
        time.Sleep(1 * time.Second)
    }
}

实现说明:

  1. 使用clipboard.ReadAll()读取剪切板内容
  2. 通过比较当前内容与上一次内容检测变化
  3. 使用循环轮询(1秒间隔)持续监控
  4. 过滤空内容避免误报

安装依赖:

go get github.com/atotto/clipboard

注意事项:

  • 该方法通过轮询实现,可能有一定性能开销
  • 在macOS上可能需要辅助功能权限
  • 如需更精确的实时监听,需使用各系统的原生API(如Windows的AddClipboardFormatListener)

扩展建议: 如需更高效实现,可考虑使用各平台特定的系统API,但这会增加代码复杂度。上述方案在大多数场景下已足够使用。

回到顶部