WindowHandle で特定のウィンドウを操作する

Recipe ID: rust-009

コマンドを呼び出したそのウィンドウ自身を操作したい場合(例:自分自身のタイトルを変える、自分自身を閉じる、座標を移動する)は、引数に WebviewWindow を受け取ることができます。

Tauri v2 では、ウィンドウ操作とWebView操作が統合された WebviewWindow 型を使用するのが一般的です。

実装例

引数に window: tauri::WebviewWindow を追加します。
Tauri は、どのウィンドウからコマンドが呼ばれたかを判断し、自動的に正しいウィンドウのインスタンスを渡してくれます。

use tauri::WebviewWindow;

#[tauri::command]
fn update_window_title(window: WebviewWindow, new_title: String) {
    // 呼び出し元のウィンドウのタイトルを変更
    // エラーハンドリングは省略していますが、実用では .unwrap() や ? を考慮してください
    let _ = window.set_title(&new_title);
}

#[tauri::command]
fn close_myself(window: WebviewWindow) {
    // このウィンドウだけを閉じる
    // メインウィンドウを閉じてもアプリが終了するとは限りません(設定によります)
    let _ = window.close();
}

ウィンドウの識別(Label)

全てのウィンドウには一意の「ラベル(Label)」文字列が付いています。
メインウィンドウのデフォルトラベルは "main" です。
取得した window オブジェクトから、自身のラベルを知ることができます。

#[tauri::command]
fn who_am_i(window: WebviewWindow) -> String {
    // 現在のウィンドウのラベルを返す
    // 例: "main", "settings", "overlay-1" など
    window.label().to_string()
}

注意点

WebviewWindowAppHandle と同様にクローン可能で、非同期タスクに渡して後から操作することが可能です。

#[tauri::command]
async fn close_after_delay(window: WebviewWindow) {
    // 非同期関数の場合、実行中にウィンドウが閉じられる可能性があるため少し注意が必要ですが、
    // 基本的には window 変数をそのまま使えます。
    tokio::time::sleep(std::time::Duration::from_secs(2)).await;
    let _ = window.close();
}