ウィンドウを画面中央に配置する

center: true と center()(権限 core:window:allow-center)でウィンドウを中央に置く。どのモニターの中央になるか、サブウィンドウの中央配置、初回表示のチラつき対策も示す。

ウィンドウ 対象: Tauri 2.x 更新日: 読了目安: 約7分 win-025
目次
  1. 前提条件
  2. 1. フロントエンドから実装する (TypeScript)
  3. 実行時に中央寄せする
  4. 初回表示のチラつきを防ぐ
  5. サブウィンドウを中央に作る
  6. 特定のモニターの中央に置く
  7. 2. バックエンドから実装する (Rust)
  8. 動作確認
  9. よくあるエラーと対処法
  10. OS ごとの違いと注意点
  11. 関連レシピ

起動直後のメインウィンドウや、設定・ログインなどのサブウィンドウは画面中央に出すのが自然です。tauri.conf.json の center: true で生成時に中央へ置けるほか、実行中に JS の center() や Rust の window.center() で任意のタイミングに中央寄せできます。マルチモニターでは「どのモニターの中央か」が問題になるので、その挙動と特定モニターの中央に置く方法、初回表示でウィンドウが一瞬ずれた位置に出てから移動する「チラつき」を消す手順も説明します。

前提条件

プラグインは不要です。JS から center() を呼ぶ場合、core:window:allow-center は core:window:default に含まれないので src-tauri/capabilities/default.json に追加します。チラつき対策で show() も使うなら core:window:allow-show も必要です。設定ファイルの center: true だけなら権限は不要です。

{
  "permissions": ["core:default", "core:window:allow-center", "core:window:allow-show"]
}

起動時に中央へ置く設定です。x / y を同時に書くと意図が矛盾するので、center を使うときは座標を書きません。

{
  "app": {
    "windows": [
      { "label": "main", "width": 800, "height": 600, "center": true }
    ]
  }
}

1. フロントエンドから実装する (TypeScript)

実行時に中央寄せする

center() はそのウィンドウが現在乗っているモニターの中央に移動します。サイズ変更直後に呼ぶと、拡大したウィンドウが画面からはみ出すのを防げます。

import { getCurrentWindow, LogicalSize } from '@tauri-apps/api/window';

const win = getCurrentWindow();
export async function resizeAndCenter(width: number, height: number) {
  await win.setSize(new LogicalSize(width, height)); // core:window:allow-set-size が必要
  await win.center();
}

初回表示のチラつきを防ぐ

フロントエンドの初期化に時間がかかるアプリでは、白いウィンドウが出てから内容が描かれ、位置調整と合わせて落ち着きません。visible: false で作り、準備できたら center() → show() の順で呼ぶと、完成した状態のウィンドウが中央に一度で現れます。

{ "label": "main", "width": 800, "height": 600, "visible": false }
import { getCurrentWindow } from '@tauri-apps/api/window';

async function initializeApp() {
  // データ読み込みや初期描画など、アプリの準備処理を書く
}

window.addEventListener('DOMContentLoaded', async () => {
  const win = getCurrentWindow();
  try {
    await initializeApp();
    await win.center();
  } finally {
    await win.show();        // 例外が起きても必ず表示する
  }
});

サブウィンドウを中央に作る

WebviewWindow のオプションにも center があります。生成時に指定するので追加権限は core:webview:allow-create-webview-window だけです(win-017 参照)。

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

const settings = new WebviewWindow('settings', {
  url: '/settings.html', title: '設定', width: 520, height: 400, center: true, resizable: false,
});
settings.once('tauri://error', (e) => console.error('create failed', e));

特定のモニターの中央に置く

center() は現在のモニター基準なので、「マウスカーソルがあるモニターの中央」にしたい場合は座標を計算して setPosition() します(core:window:allow-set-position が必要)。

import { cursorPosition, monitorFromPoint, getCurrentWindow, PhysicalPosition } from '@tauri-apps/api/window';

export async function centerOnCursorMonitor() {
  const cur = await cursorPosition();
  const m = await monitorFromPoint(cur.x, cur.y);
  if (!m) return;
  const win = getCurrentWindow();
  const size = await win.outerSize();
  await win.setPosition(new PhysicalPosition(
    m.position.x + Math.floor((m.size.width - size.width) / 2),
    m.position.y + Math.floor((m.size.height - size.height) / 2),
  ));
}

2. バックエンドから実装する (Rust)

Window / WebviewWindow の center() を呼びます。setup フックで非表示のまま中央寄せしてから表示すれば、フロント側の権限追加なしにチラつき対策ができます。新規作成時は WebviewWindowBuilder::new(...).center().build() です。

use tauri::Manager;

#[tauri::command]
fn center_window(app: tauri::AppHandle, label: String) -> Result<(), String> {
    let window = app
        .get_webview_window(&label)
        .ok_or_else(|| format!("window '{}' not found", label))?;
    window.center().map_err(|e| e.to_string())
}

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .setup(|app| {
            // tauri.conf.json で "visible": false にしておく
            if let Some(main) = app.get_webview_window("main") {
                main.center()?;
                main.show()?;
            }
            Ok(())
        })
        .invoke_handler(tauri::generate_handler![center_window])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}
import { invoke } from '@tauri-apps/api/core';
await invoke('center_window', { label: 'main' });

動作確認

npm run tauri dev で起動すると、center: true のウィンドウはプライマリモニターの中央に現れます(x / y も指定した場合は、その座標を含むモニターの中央)。サブモニターへドラッグしてから center() を呼ぶと、サブモニターの中央に戻ります。チラつき対策版では show() までウィンドウが一切表示されず、完成した画面が中央に一度で出ます。

よくあるエラーと対処法

  • window.center not allowed. Permissions associated with this command: core:window:allow-center という趣旨のエラー: 権限未追加です。追加して tauri dev を再起動します。
  • visible: false にしたらウィンドウが二度と出ない: show() の呼び忘れか、その前に JS が例外で止まっています。上記のように try/finally で必ず show() に到達させるか、Rust の setup で show() する方式にしておくと安全です。
  • 中央に来るがタイトルバーが画面上端に隠れる: ウィンドウが作業領域より大きいと、はみ出した分が隠れます。モニター情報 の workArea に収まる大きさにしてから中央に置きます。
  • サブウィンドウが親の中央ではなく画面中央に出る: center はモニター基準です。親の中央にしたい場合は、親の outerPosition() / outerSize() から座標を計算して x / y オプションに渡します。

OS ごとの違いと注意点

  • どの OS でも: 起動時の center: true は、位置の指定がなければプライマリモニター、x / y を指定すればその座標を含むモニターの、作業領域(タスクバーやメニューバーなどを除いた範囲)の中央に置きます。実行中の center() は、ウィンドウが今いるモニターが基準です。サブモニターに出したいときは、そのモニター上の x / y を指定するか、位置を指定 して移してから center() を呼びます。
  • Linux: Wayland ではアプリからの位置指定が制限され、center() や center: true が効かないコンポジターがあります。X11 では問題ありません。
  • スケール倍率の異なるモニターへ setPosition() した直後は物理サイズが変わって中央からずれます。移動後にもう一度 center() を呼ぶと補正できます。

関連レシピ

参考リンク(公式ドキュメント)

Web Ninja

この記事を書いた人

Web Ninja ウェブエンジニア (Web Engineer)

会社員ネットワークエンジニアから独立してかれこれ 25 年以上 Web エンジニアとして活動中。普段は JavaScript と Node.js を自在に操り、時には C++ や Perl といった古流の技も嗜みます。近年は Tauri × Rust という新たな武器を手に、デスクトップアプリ開発の最前線を駆け抜けています。「作りたい」を「作れる」に変えるための、実践的な「技」をお届けします。

お問い合わせ: tauri.ninja@gmail.com

内容の誤り・動かないコードを報告する