Rust コードからクリップボードを操作する

Recipe ID: rust-017

テキストや画像のコピー&ペースト機能を Rust 側から制御する方法です。
Tauri v2 では tauri-plugin-clipboard-manager プラグインを使用します。

前提条件

Permissions (権限) の設定

クリップボード操作は機密情報に触れる可能性があるため、明示的な権限設定が必要です。
src-tauri/capabilities/default.json に以下を追加します。

{
    "permissions": [
        "clipboard-manager:allow-read-image",
        "clipboard-manager:allow-read-text",
        "clipboard-manager:allow-write-image",
        "clipboard-manager:allow-write-text",
        ...
    ]
}

1. プラグインの導入

src-tauri ディレクトリで以下のコマンドを実行します。

cargo add tauri-plugin-clipboard-manager

また、画像を扱う場合は Cargo.tomltauri 依存関係に image-png (または image-ico) 機能を追加する必要があります。

[dependencies]
tauri = { version = "2", features = ["image-png"] } 

lib.rs でプラグインを初期化します。

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .plugin(tauri_plugin_clipboard_manager::init())
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

2. テキストの読み書き

tauri_plugin_clipboard_manager::ClipboardExt トレイトを use することで、app.clipboard() が使えるようになります。

use tauri_plugin_clipboard_manager::ClipboardExt;

#[tauri::command]
fn copy_text(app: tauri::AppHandle, text: String) {
    // クリップボードに書き込み
    if let Err(e) = app.clipboard().write_text(text) {
        eprintln!("コピー失敗: {}", e);
    }
}

#[tauri::command]
fn paste_text(app: tauri::AppHandle) -> String {
    // クリップボードから読み取り
    // 失敗する(中身がない、テキストではない等)場合は空文字を返す例
    app.clipboard().read_text().unwrap_or_default()
}

3. 画像の書き込み

画像データを書き込むには tauri::image::Image を使います。

use tauri::image::Image;
use tauri_plugin_clipboard_manager::ClipboardExt;

#[tauri::command]
fn copy_icon(app: tauri::AppHandle) {
    // 例として、埋め込まれたPNG画像データをコピーします
    let bytes = include_bytes!("../icons/icon.png");
    
    // バイト列から Image オブジェクトを作成
    if let Ok(image) = Image::from_bytes(bytes) {
        // クリップボードへ書き込み
        let _ = app.clipboard().write_image(&image);
        println!("アイコンをコピーしました");
    }
}

まとめ

  • プラグイン tauri-plugin-clipboard-manager を使う。
  • ClipboardExt を use することで、app.clipboard() メソッドが利用可能になる。
  • read_text, write_text, read_image, write_image が基本メソッド。
  • capabilities (権限) の設定を忘れずに。