Rust剪贴板操作库window_clipboard的使用:跨平台系统剪贴板读写与内容管理
Rust剪贴板操作库window_clipboard的使用:跨平台系统剪贴板读写与内容管理
一个从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运行时)
注意事项
- 需要有效的窗口句柄才能创建剪贴板实例
- 在某些平台上可能需要特定的权限
- 剪贴板操作可能会受到系统安全策略的限制
- 这是一个实验性库,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(())
}
注意事项
- 在某些系统上可能需要相应的权限才能访问剪贴板
- 多线程环境下需要注意剪贴板访问的同步问题
- 不同平台的剪贴板行为可能略有差异
这个库提供了简单直观的API来处理跨平台的剪贴板操作,适合需要在Rust应用中集成剪贴板功能的开发需求。