開いている全ウィンドウのリストを取得する

Recipe ID: win-030

現在アプリ内で開かれている全てのウィンドウ(WebviewWindowインスタンス)を取得し、一括操作する方法を紹介します。

例えば「設定ウィンドウが既に開いているか確認する」場合や、「メイン以外の全ウィンドウを閉じる」といった一括処理を行う場合に役立ちます。
ラベルによる特定ウィンドウの取得や、全ウィンドウの列挙方法について解説します。

前提条件

Permissions (権限) の設定

src-tauri/capabilities/default.json に以下の権限を追加します。

{
  "permissions": [
    ...,
    "core:window:default"
  ]
}

1. フロントエンドから変更する (TypeScript)

権限設定 (Permissions)

この機能を使用するには、ケーパビリティファイルに権限を追加する必要がありますが、getAllWebviewWindows そのものに対する専用の権限名はありません。通常、ウィンドウ操作を行うための基本的な権限(core:window:default など)があれば動作します。

サンプルコード (全ウィンドウ取得)

getAllWebviewWindows 関数を使用します。これは WebviewWindow の配列を返します。

import { getAllWebviewWindows } from '@tauri-apps/api/webviewWindow';

// 全ての WebviewWindow を取得
const allWindows = await getAllWebviewWindows();

allWindows.forEach(async (win) => {
  const label = win.label;
  
  // 各ウィンドウのタイトルを取得してログ出力
  const title = await win.title();
  console.log(`Label: ${label}, Title: ${title}`);
  
  // 例: "settings" というラベルのウィンドウ以外を最小化する
  if (label !== 'settings') {
    await win.minimize();
  }
});

サンプルコード (特定のウィンドウ取得)

特定のラベルを持つウィンドウインスタンスが欲しい場合は、WebviewWindow.getByLabel 静的メソッドを使用します。

import { WebviewWindow } from '@tauri-apps/api/webviewWindow';

// "settings" というラベルのウィンドウを取得
// 存在しない場合は null が返ります
const settingsWindow = await WebviewWindow.getByLabel('settings');

if (settingsWindow) {
  console.log('設定ウィンドウが見つかりました');
  await settingsWindow.setFocus();
} else {
  console.log('設定ウィンドウは開いていません');
}

2. バックエンドから変更する (Rust)

AppHandlewebview_windows メソッドを使用すると、現在管理されている全てのウィンドウを取得できます(戻り値は HashMap<String, WebviewWindow>)。

use tauri::Manager;

#[tauri::command]
fn log_all_windows(app_handle: tauri::AppHandle) {
    let windows = app_handle.webview_windows();
    
    for (label, window) in windows {
        println!("Window Label: {}", label);
        // 必要に応じてウィンドウを操作
        if label != "main" {
            window.minimize().unwrap();
        }
    }
}