Rust剪贴板操作库clipboard_macos的使用:macOS平台下高效管理剪贴板内容的Rust插件

Rust剪贴板操作库clipboard_macos的使用:macOS平台下高效管理剪贴板内容的Rust插件

clipboard_macos是一个专门为macOS平台设计的Rust剪贴板操作库,它提供了简洁高效的API来管理剪贴板内容。

安装

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

cargo add clipboard_macos

或者在Cargo.toml中添加:

clipboard_macos = "0.1.1"

基本使用示例

以下是使用clipboard_macos库的基本示例:

use clipboard_macos::Clipboard;

fn main() {
    // 创建剪贴板实例
    let clipboard = Clipboard::new().unwrap();
    
    // 向剪贴板写入文本
    clipboard.write_text("Hello, clipboard!").unwrap();
    
    // 从剪贴板读取文本
    let text = clipboard.read_text().unwrap();
    println!("Clipboard contents: {}", text);
}

完整示例代码

下面是一个更完整的示例,展示了更多剪贴板操作功能:

use clipboard_macos::Clipboard;
use std::error::Error;

fn main() -> Result<(), Box<dyn Error>> {
    // 初始化剪贴板
    let clipboard = Clipboard::new()?;
    
    // 检查剪贴板是否包含文本
    if clipboard.has_text()? {
        println!("剪贴板当前包含文本内容");
        
        // 读取剪贴板文本
        let current_text = clipboard.read_text()?;
        println!("当前剪贴板内容: {}", current_text);
        
        // 清除剪贴板内容
        clipboard.clear()?;
        println!("已清除剪贴板内容");
    } else {
        println!("剪贴板当前不包含文本");
    }
    
    // 写入新内容到剪贴板
    let new_text = "这是新的剪贴板内容";
    clipboard.write_text(new_text)?;
    println!("已写入新内容到剪贴板: {}", new_text);
    
    Ok(())
}

功能特点

  1. 简洁的API设计
  2. 支持文本读写操作
  3. 可以检查剪贴板内容类型
  4. 提供清除剪贴板功能
  5. 专门针对macOS平台优化

完整示例demo

以下是一个更完整的演示示例,展示了如何在实际应用中使用clipboard_macos库:

use clipboard_macos::Clipboard;
use std::error::Error;
use std::io::{self, Write};

fn main() -> Result<(), Box<dyn Error>> {
    let clipboard = Clipboard::new()?;
    
    // 打印菜单
    println!("macOS剪贴板操作演示");
    println!("1. 读取剪贴板内容");
    println!("2. 写入剪贴板内容");
    println!("3. 检查剪贴板是否有文本");
    println!("4. 清除剪贴板");
    println!("5. 退出");
    
    loop {
        print!("请选择操作(1-5): ");
        io::stdout().flush()?;
        
        let mut input = String::new();
        io::stdin().read_line(&mut input)?;
        
        match input.trim() {
            "1" => {
                if clipboard.has_text()? {
                    let text = clipboard.read_text()?;
                    println!("剪贴板内容: {}", text);
                } else {
                    println!("剪贴板中没有文本内容");
                }
            }
            "2" => {
                print!("请输入要写入剪贴板的文本: ");
                io::stdout().flush()?;
                let mut text = String::new();
                io::stdin().read_line(&mut text)?;
                clipboard.write_text(text.trim())?;
                println!("已写入剪贴板");
            }
            "3" => {
                if clipboard.has_text()? {
                    println!("剪贴板包含文本");
                } else {
                    println!("剪贴板不包含文本");
                }
            }
            "4" => {
                clipboard.clear()?;
                println!("已清除剪贴板");
            }
            "5" => {
                println!("退出程序");
                break;
            }
            _ => println!("无效输入,请选择1-5"),
        }
    }
    
    Ok(())
}

这个完整示例实现了一个简单的交互式剪贴板操作程序,包含了读取、写入、检查和清除剪贴板内容的功能。


1 回复

以下是基于您提供的内容整理的完整示例demo:

基本用法示例

// 写入剪贴板示例
use clipboard_macos::Clipboard;

fn main() {
    // 创建剪贴板实例
    let clipboard = Clipboard::new().unwrap();
    
    // 写入文本到剪贴板
    clipboard.write_string("Hello from Rust!").unwrap();
    println!("文本已复制到剪贴板");
    
    // 从剪贴板读取文本
    let content = clipboard.read_string().unwrap();
    println!("剪贴板内容: {}", content);
}

高级功能示例

use clipboard_macos::{Clipboard, ContentType};
use std::time::Duration;

fn main() {
    let clipboard = Clipboard::new().unwrap();
    
    // 检查剪贴板内容类型
    match clipboard.content_type() {
        Ok(ContentType::Text) => println!("剪贴板包含文本"),
        Ok(ContentType::Image) => println!("剪贴板包含图片"),
        Ok(ContentType::Unknown) => println!("剪贴板包含未知内容"),
        Err(e) => eprintln!("检查剪贴板出错: {}", e),
    }
    
    // 清除剪贴板
    clipboard.clear().unwrap();
    println!("剪贴板已清空");
    
    // 监听剪贴板变化
    let mut last_content = String::new();
    loop {
        std::thread::sleep(Duration::from_secs(1));
        let current_content = clipboard.read_string().unwrap_or_default();
        
        if current_content != last_content {
            println!("剪贴板内容变化: {}", current_content);
            last_content = current_content;
        }
    }
}

完整应用示例

use clipboard_macos::{Clipboard, ContentType};
use std::{thread, time::Duration};

struct ClipboardMonitor {
    clipboard: Clipboard,
}

impl ClipboardMonitor {
    fn new() -> Self {
        Self {
            clipboard: Clipboard::new().unwrap(),
        }
    }
    
    // 写入剪贴板
    fn copy(&self, text: &str) {
        if let Err(e) = self.clipboard.write_string(text) {
            eprintln!("写入剪贴板失败: {}", e);
        }
    }
    
    // 读取剪贴板
    fn paste(&self) -> String {
        self.clipboard.read_string().unwrap_or_default()
    }
    
    // 监控剪贴板变化
    fn monitor(&self, interval: u64) {
        let mut last_content = self.paste();
        println!("开始监控剪贴板(间隔{}秒)...", interval);
        
        loop {
            thread::sleep(Duration::from_secs(interval));
            let current_content = self.paste();
            
            if !current_content.is_empty() && current_content != last_content {
                println!("[新内容] {}", current_content);
                last_content = current_content;
                
                // 根据内容类型处理
                match self.clipboard.content_type() {
                    Ok(ContentType::Text) => self.process_text(&current_content),
                    Ok(ContentType::Image) => println!("检测到图片内容"),
                    _ => {}
                }
            }
        }
    }
    
    fn process_text(&self, text: &str) {
        println!("处理文本: {} 字符", text.len());
        // 这里可以添加文本处理逻辑
    }
}

fn main() {
    let monitor = ClipboardMonitor::new();
    
    // 测试写入
    monitor.copy("Rust剪贴板监控示例");
    println!("当前剪贴板内容: {}", monitor.paste());
    
    // 开始监控
    monitor.monitor(2);
}

错误处理示例

use clipboard_macos::Clipboard;

fn main() {
    // 更健壮的错误处理
    let clipboard = match Clipboard::new() {
        Ok(clip) => clip,
        Err(e) => {
            eprintln!("无法访问剪贴板: {}", e);
            std::process::exit(1);
        }
    };
    
    // 尝试写入大数据
    let large_text = "a".repeat(100_000);
    if let Err(e) = clipboard.write_string(&large_text) {
        eprintln!("写入大文本失败: {}", e);
        println!("建议分块处理大数据");
    }
}

注意事项:

  1. 本库仅适用于macOS平台
  2. 首次使用需要授予"辅助功能"权限
  3. 监控剪贴板变化会占用线程资源
  4. 处理大文本时建议分块操作
回到顶部