Rust剪贴板操作库window_clipboard的使用:跨平台系统剪贴板读写与内容管理

Rust剪贴板操作库window_clipboard的使用:跨平台系统剪贴板读写与内容管理

Test Status Documentation Crates.io License

一个从raw-window-handle获取剪贴板访问权限的库。

非常实验性,使用风险自负!

安装

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

cargo add window_clipboard

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

window_clipboard = "0.4.1"

示例代码

use raw_window_handle::RawWindowHandle;
use window_clipboard::Clipboard;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 获取窗口句柄(这里需要根据具体的窗口系统实现)
    let window_handle: RawWindowHandle = get_window_handle();
    
    // 创建剪贴板实例
    let mut clipboard = Clipboard::from_window_handle(&window_handle)?;
    
    // 写入文本到剪贴板
    clipboard.write("Hello, Clipboard!")?;
    println!("文本已写入剪贴板");
    
    // 从剪贴板读取文本
    if let Some(content) = clipboard.read()? {
        println!("从剪贴板读取的内容: {}", content);
    } else {
        println!("剪贴板为空或包含非文本内容");
    }
    
    // 清空剪贴板
    clipboard.clear()?;
    println!("剪贴板已清空");
    
    Ok(())
}

// 根据具体平台获取窗口句柄的函数
#[cfg(target_os = "windows")]
fn get_window_handle() -> RawWindowHandle {
    use raw_window_handle::Win32Handle;
    
    // Windows平台实现
    // 这里需要实际的窗口句柄
    RawWindowHandle::Win32(Win32Handle {
        hwnd: std::ptr::null_mut(),
        hinstance: std::ptr::null_mut(),
    })
}

#[cfg(target_os = "macos")]
fn get_window_handle() -> RawWindowHandle {
    use raw_window_handle::AppKitHandle;
    
    // macOS平台实现
    RawWindowHandle::AppKit(AppKitHandle {
        ns_window: std::ptr::null_mut(),
        ns_view: std::ptr::null_mut(),
    })
}

#[cfg(target_os = "linux")]
fn get_window_handle() -> RawWindowHandle {
    use raw_window_handle::XlibHandle;
    
    // Linux平台实现
    RawWindowHandle::Xlib(XlibHandle {
        window: 0,
        display: std::ptr::null_mut(),
    })
}

完整示例demo

use raw_window_handle::{HasRawWindowHandle, RawWindowHandle};
use window_clipboard::Clipboard;
use winit::{
    event::{Event, WindowEvent},
    event_loop::{ControlFlow, EventLoop},
    window::WindowBuilder,
};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 创建窗口和事件循环
    let event_loop = EventLoop::new();
    let window = WindowBuilder::new()
        .with_title("Clipboard Example")
        .build(&event_loop)?;

    // 获取窗口句柄
    let window_handle = window.raw_window_handle();
    
    // 创建剪贴板实例
    let mut clipboard = Clipboard::from_window_handle(&window_handle)?;

    event_loop.run(move |event, _, control_flow| {
        *control_flow = ControlFlow::Wait;

        match event {
            Event::WindowEvent {
                event: WindowEvent::CloseRequested,
                ..
            } => {
                *control_flow = ControlFlow::Exit;
            }
            Event::WindowEvent {
                event: WindowEvent::KeyboardInput { input, .. },
                ..
            } => {
                if let Some(virtual_keycode) = input.virtual_keycode {
                    match virtual_keycode {
                        // 按下Ctrl+C复制文本
                        winit::event::VirtualKeyCode::C if input.modifiers.ctrl() => {
                            if let Err(e) = clipboard.write("Copied from Rust application!") {
                                eprintln!("复制失败: {}", e);
                            } else {
                                println!("文本已复制到剪贴板");
                            }
                        }
                        // 按下Ctrl+V粘贴文本
                        winit::event::VirtualKeyCode::V if input.modifiers.ctrl() => {
                            match clipboard.read() {
                                Ok(Some(content)) => {
                                    println!("从剪贴板粘贴的内容: {}", content);
                                }
                                Ok(None) => {
                                    println!("剪贴板为空");
                                }
                                Err(e) => {
                                    eprintln!("粘贴失败: {}", e);
                                }
                            }
                        }
                        // 按下Ctrl+X剪切文本
                        winit::event::VirtualKeyCode::X if input.modifiers.ctrl() => {
                            if let Err(e) = clipboard.write("Cut text from Rust application!") {
                                eprintln!("剪切失败: {}", e);
                            } else {
                                println!("文本已剪切到剪贴板");
                            }
                        }
                        _ => {}
                    }
                }
            }
            _ => {}
        }
    });
}

功能特性

  • 跨平台支持: 支持Windows、macOS和Linux系统
  • 简单易用: 提供简洁的API进行剪贴板操作
  • 安全可靠: 基于Rust的内存安全特性
  • 异步支持: 支持异步操作(需要结合async运行时)

注意事项

  1. 需要有效的窗口句柄才能创建剪贴板实例
  2. 在某些平台上可能需要特定的权限
  3. 剪贴板操作可能会受到系统安全策略的限制
  4. 这是一个实验性库,API可能会发生变化

错误处理

剪贴板操作可能会失败,建议总是处理可能的错误:

match clipboard.write("Some text") {
    Ok(()) => println!("写入成功"),
    Err(e) => eprintln!("写入失败: {}", e),
}

match clipboard.read() {
    Ok(Some(text)) => println!("读取成功: {}", text),
    Ok(None) => println!("剪贴板为空"),
    Err(e) => eprintln!("读取失败: {}", e),
}

这个库提供了基本的剪贴板读写功能,适合需要在Rust应用程序中进行剪贴板操作的场景。


1 回复

Rust剪贴板操作库window_clipboard使用指南

概述

window_clipboard是一个跨平台的Rust剪贴板操作库,支持Windows、macOS和Linux系统。该库提供了简洁的API来实现系统剪贴板的读写操作和内容管理功能。

安装方法

在Cargo.toml中添加依赖:

[dependencies]
window_clipboard = "0.1"

基本用法

1. 写入剪贴板内容

use window_clipboard::Clipboard;

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

2. 读取剪贴板内容

use window_clipboard::Clipboard;

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

3. 检查剪贴板内容格式

use window_clipboard::{Clipboard, Format};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut clipboard = Clipboard::new()?;
    
    // 检查剪贴板是否包含文本内容
    if clipboard.has_format(Format::Text) {
        println!("剪贴板包含文本内容");
    }
    
    Ok(())
}

高级功能

1. 清空剪贴板

use window_clipboard::Clipboard;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut clipboard = Clipboard::new()?;
    
    // 清空剪贴板内容
    clipboard.clear()?;
    
    println!("剪贴板已清空");
    Ok(())
}

2. 处理剪贴板所有权

use window_clipboard::Clipboard;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut clipboard = Clipboard::new()?;
    
    // 获取剪贴板所有权
    let _clipboard_owner = clipboard.become_owner()?;
    
    // 在此期间,其他应用程序无法修改剪贴板内容
    clipboard.set_text("独占剪贴板内容")?;
    
    Ok(())
}

错误处理

use window_clipboard::Clipboard;

fn main() {
    match Clipboard::new() {
        Ok(mut clipboard) => {
            if let Err(e) = clipboard.set_text("测试内容") {
                eprintln!("写入剪贴板失败: {}", e);
            }
        }
        Err(e) => {
            eprintln!("初始化剪贴板失败: {}", e);
        }
    }
}

完整示例代码

use window_clipboard::{Clipboard, Format};
use std::error::Error;

fn main() -> Result<(), Box<dyn Error>> {
    // 创建剪贴板实例
    let mut clipboard = Clipboard::new()?;
    
    // 示例1:写入文本到剪贴板
    println!("=== 写入剪贴板内容 ===");
    clipboard.set_text("Hello, Rust Clipboard!")?;
    println!("文本已成功写入剪贴板");
    
    // 示例2:读取剪贴板内容
    println!("\n=== 读取剪贴板内容 ===");
    let content = clipboard.get_text()?;
    println!("当前剪贴板内容: {}", content);
    
    // 示例3:检查剪贴板格式
    println!("\n=== 检查剪贴板格式 ===");
    if clipboard.has_format(Format::Text) {
        println!("剪贴板包含文本格式内容");
    } else {
        println!("剪贴板不包含文本格式内容");
    }
    
    // 示例4:清空剪贴板
    println!("\n=== 清空剪贴板 ===");
    clipboard.clear()?;
    println!("剪贴板已清空");
    
    // 示例5:处理剪贴板所有权
    println!("\n=== 获取剪贴板所有权 ===");
    let _owner = clipboard.become_owner()?;
    clipboard.set_text("独占访问的内容")?;
    println!("已获取剪贴板所有权并设置内容");
    
    // 验证内容已设置
    let owned_content = clipboard.get_text()?;
    println!("所有权模式下的内容: {}", owned_content);
    
    Ok(())
}

注意事项

  1. 在某些系统上可能需要相应的权限才能访问剪贴板
  2. 多线程环境下需要注意剪贴板访问的同步问题
  3. 不同平台的剪贴板行为可能略有差异

这个库提供了简单直观的API来处理跨平台的剪贴板操作,适合需要在Rust应用中集成剪贴板功能的开发需求。

回到顶部