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!("剪贴板已清空");
}
功能说明
- 初始化剪贴板:通过
Clipboard::new()
创建剪贴板实例 - 设置剪贴板内容:使用
set_text()
方法将文本复制到剪贴板 - 获取剪贴板内容:使用
get_text()
方法从剪贴板获取文本 - 错误处理:所有操作都返回Result类型,需要进行错误处理
- 剪贴板监控:通过定期检查可以实现简单的剪贴板内容监控
注意事项
- 该库仅适用于X11环境,在Wayland或其他显示服务器上无法工作
- 剪贴板操作可能会失败,特别是在多线程环境中使用时
- 对于大量文本操作,可能需要考虑性能影响
这个库为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),
}
}
}
这个示例实现了一个简单的交互式剪贴板管理器,支持以下功能:
- 获取当前剪贴板内容
- 设置剪贴板内容
- 监控剪贴板变化
- 清空剪贴板
- 退出程序
使用方法:
- 编译运行程序
- 输入命令与剪贴板交互
- 输入"exit"退出程序
这个示例展示了clipboard_x11库在实际应用中的典型用法,包括错误处理、交互式操作和剪贴板监控等功能。
1 回复