現在アプリ内で開かれている全てのウィンドウ(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)
AppHandle の webview_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();
}
}
}