Rust X11剪贴板操作库clipboard_x11的使用,实现跨应用高效文本复制粘贴功能

Rust X11剪贴板操作库clipboard_x11的使用,实现跨应用高效文本复制粘贴功能

安装

在项目目录中运行以下Cargo命令:

cargo add clipboard_x11

或者在Cargo.toml中添加以下行:

clipboard_x11 = "0.4.2"

基本使用示例

以下是使用clipboard_x11库进行基本剪贴板操作的示例:

use clipboard_x11::Clipboard;

fn main() {
    // 创建剪贴板实例
    let clipboard = Clipboard::new().unwrap();
    
    // 将文本复制到剪贴板
    clipboard.set_text("Hello from Rust!").unwrap();
    
    // 从剪贴板获取文本
    let text = clipboard.get_text().unwrap();
    println!("从剪贴板获取的内容: {}", text);
}

完整示例代码

下面是一个更完整的示例,演示了如何实现跨应用的文本复制粘贴功能:

use clipboard_x11::Clipboard;
use std::thread;
use std::time::Duration;

fn main() {
    // 初始化剪贴板
    let clipboard = match Clipboard::new() {
        Ok(clip) => clip,
        Err(e) => {
            eprintln!("无法初始化剪贴板: {}", e);
            return;
        }
    };

    // 示例1: 基本复制粘贴
    println!("示例1: 基本复制粘贴");
    let sample_text = "Rust剪贴板示例文本";
    clipboard.set_text(sample_text).unwrap();
    println!("已复制文本到剪贴板: {}", sample_text);
    
    // 等待2秒,模拟用户切换到其他应用粘贴
    thread::sleep(Duration::from_secs(2));
    
    let pasted_text = clipboard.get_text().unwrap();
    println!("从剪贴板获取的文本: {}", pasted_text);
    assert_eq!(sample_text, pasted_text);
    
    // 示例2: 剪贴板内容监控
    println!("\n示例2: 剪贴板内容监控");
    let mut last_content = String::new();
    
    for i in 1..=5 {
        thread::sleep(Duration::from_secs(1));
        
        if let Ok(current) = clipboard.get_text() {
            if current != last_content {
                println!("检测到剪贴板内容变化 ({}): {}", i, current);
                last_content = current;
            }
        }
    }
    
    // 示例3: 清空剪贴板
    println!("\n示例3: 清空剪贴板");
    clipboard.set_text("").unwrap();
    println!("剪贴板已清空");
}

功能说明

  1. 初始化剪贴板:通过Clipboard::new()创建剪贴板实例
  2. 设置剪贴板内容:使用set_text()方法将文本复制到剪贴板
  3. 获取剪贴板内容:使用get_text()方法从剪贴板获取文本
  4. 错误处理:所有操作都返回Result类型,需要进行错误处理
  5. 剪贴板监控:通过定期检查可以实现简单的剪贴板内容监控

注意事项

  1. 该库仅适用于X11环境,在Wayland或其他显示服务器上无法工作
  2. 剪贴板操作可能会失败,特别是在多线程环境中使用时
  3. 对于大量文本操作,可能需要考虑性能影响

这个库为Rust程序提供了简单直接的X11剪贴板访问能力,适合需要与系统剪贴板交互的GUI应用或命令行工具开发。

完整示例demo

以下是一个更完整的示例,展示了如何使用clipboard_x11库实现一个简单的剪贴板管理器:

use clipboard_x11::Clipboard;
use std::thread;
use std::time::Duration;
use std::io::{self, Write};

fn main() {
    // 初始化剪贴板
    let clipboard = match Clipboard::new() {
        Ok(clip) => clip,
        Err(e) => {
            eprintln!("初始化剪贴板失败: {}", e);
            return;
        }
    };

    println!("简单剪贴板管理器 (X11)");
    println!("输入 'exit' 退出程序");
    println!("输入 'get' 获取当前剪贴板内容");
    println!("输入 'set <文本>' 设置剪贴板内容");
    println!("输入 'monitor' 开始监控剪贴板变化");
    println!("输入 'clear' 清空剪贴板");

    loop {
        print!("> ");
        io::stdout().flush().unwrap();
        
        let mut input = String::new();
        io::stdin().read_line(&mut input).unwrap();
        let input = input.trim();
        
        match input {
            "exit" => break,
            "get" => {
                match clipboard.get_text() {
                    Ok(text) => println!("当前剪贴板内容: {}", text),
                    Err(e) => eprintln!("获取剪贴板内容失败: {}", e),
                }
            },
            "clear" => {
                if let Err(e) = clipboard.set_text("") {
                    eprintln!("清空剪贴板失败: {}", e);
                } else {
                    println!("剪贴板已清空");
                }
            },
            "monitor" => {
                println!("开始监控剪贴板变化 (Ctrl+C 停止)...");
                let mut last_content = String::new();
                loop {
                    thread::sleep(Duration::from_millis(500));
                    
                    match clipboard.get_text() {
                        Ok(current) => {
                            if current != last_content && !current.is_empty() {
                                println!("剪贴板内容变化: {}", current);
                                last_content = current;
                            }
                        },
                        Err(e) => eprintln!("监控剪贴板失败: {}", e),
                    }
                }
            },
            _ if input.starts_with("set ") => {
                let text = input.trim_start_matches("set ").trim();
                match clipboard.set_text(text) {
                    Ok(_) => println!("已设置剪贴板内容: {}", text),
                    Err(e) => eprintln!("设置剪贴板内容失败: {}", e),
                }
            },
            _ => println!("未知命令: {}", input),
        }
    }
}

这个示例实现了一个简单的交互式剪贴板管理器,支持以下功能:

  • 获取当前剪贴板内容
  • 设置剪贴板内容
  • 监控剪贴板变化
  • 清空剪贴板
  • 退出程序

使用方法:

  1. 编译运行程序
  2. 输入命令与剪贴板交互
  3. 输入"exit"退出程序

这个示例展示了clipboard_x11库在实际应用中的典型用法,包括错误处理、交互式操作和剪贴板监控等功能。


1 回复

Rust X11剪贴板操作库clipboard_x11使用指南

简介

clipboard_x11是一个专门为Linux/X11环境设计的Rust剪贴板操作库,它提供了跨应用程序进行文本复制和粘贴的功能。该库轻量高效,适合需要在Linux桌面环境下操作剪贴板的Rust应用程序。

安装

在项目的Cargo.toml中添加依赖:

[dependencies]
clipboard_x11 = "0.3"

基本用法

初始化剪贴板

use clipboard_x11::Clipboard;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 创建剪贴板实例
    let clipboard = Clipboard::new()?;
    
    Ok(())
}

复制文本到剪贴板

use clipboard_x11::Clipboard;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let clipboard = Clipboard::new()?;
    
    // 将文本复制到剪贴板
    clipboard.set_text("Hello from Rust!")?;
    
    println!("文本已复制到剪贴板");
    Ok(())
}

从剪贴板获取文本

use clipboard_x11::Clipboard;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let clipboard = Clipboard::new()?;
    
    // 从剪贴板获取文本
    let text = clipboard.get_text()?;
    
    println!("剪贴板内容: {}", text);
    Ok(())
}

高级用法

检查剪贴板内容是否可用

use clipboard_x11::Clipboard;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let clipboard = Clipboard::new()?;
    
    // 检查剪贴板是否有文本内容
    if clipboard.has_text()? {
        let text = clipboard.get_text()?;
        println!("剪贴板有文本: {}", text);
    } else {
        println!("剪贴板没有文本内容");
    }
    
    Ok(())
}

处理剪贴板所有权

use clipboard_x11::Clipboard;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let clipboard = Clipboard::new()?;
    
    // 获取剪贴板所有权
    clipboard.acquire()?;
    
    // 设置文本并保持所有权
    clipboard.set_text("这段文本将保持可用直到程序退出")?;
    
    // 在这里可以执行其他操作,剪贴板内容不会被其他应用覆盖
    
    // 释放剪贴板所有权
    clipboard.release()?;
    
    Ok(())
}

完整示例:剪贴板监视器

下面是一个监视剪贴板内容变化的完整示例:

use clipboard_x11::Clipboard;
use std::{thread, time::Duration};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let clipboard = Clipboard::new()?;
    let mut last_content = String::new();
    
    println!("剪贴板监视器已启动 (按Ctrl+C退出)...");
    
    loop {
        if let Ok(content) = clipboard.get_text() {
            if content != last_content && !content.is_empty() {
                println!("新的剪贴板内容: {}", content);
                last_content = content.clone();
            }
        }
        
        thread::sleep(Duration::from_millis(500));
    }
}

注意事项

  1. 该库仅适用于Linux/X11环境,在其他平台(如Windows或macOS)上无法工作
  2. 需要安装X11开发库(通常为libx11-devxorg-dev包)
  3. 在多线程环境中使用时需要注意同步问题
  4. 某些桌面环境(如Wayland)可能需要额外配置才能正常工作

错误处理

建议对剪贴板操作进行适当的错误处理:

use clipboard_x11::Clipboard;

fn main() {
    if let Err(e) = try_clipboard() {
        eprintln!("剪贴板操作错误: {}", e);
    }
}

fn try_clipboard() -> Result<(), Box<dyn std::error::Error>> {
    let clipboard = Clipboard::new()?;
    
    clipboard.set_text("重要的数据")?;
    
    let content = clipboard.get_text()?;
    println!("验证剪贴板内容: {}", content);
    
    Ok(())
}

完整示例:剪贴板管理器

下面是一个更完整的剪贴板管理器示例,实现了复制、粘贴和监视功能:

use clipboard_x11::Clipboard;
use std::{thread, time::Duration};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let clipboard = Clipboard::new()?;
    
    // 示例1: 复制文本到剪贴板
    clipboard.set_text("这是Rust剪贴板示例")?;
    println!("已复制示例文本到剪贴板");
    
    // 示例2: 获取剪贴板内容
    let content = clipboard.get_text()?;
    println!("当前剪贴板内容: {}", content);
    
    // 示例3: 监视剪贴板变化
    println!("开始监视剪贴板变化...");
    monitor_clipboard(&clipboard)?;
    
    Ok(())
}

fn monitor_clipboard(clipboard: &Clipboard) -> Result<(), Box<dyn std::error::Error>> {
    let mut last_content = String::new();
    
    loop {
        if let Ok(content) = clipboard.get_text() {
            if content != last_content && !content.is_empty() {
                println!("检测到剪贴板变化: {}", content);
                last_content = content.clone();
                
                // 示例4: 检查剪贴板内容类型
                if clipboard.has_text()? {
                    println!("剪贴板包含文本内容");
                }
            }
        }
        
        thread::sleep(Duration::from_millis(300));
    }
}

这个完整示例展示了:

  1. 基本的复制功能
  2. 内容读取功能
  3. 实时监视剪贴板变化
  4. 内容类型检查
  5. 错误处理(通过Result类型)

使用时可以通过Ctrl+C终止程序。

回到顶部