マルチモニターの構成を取得する

Recipe ID: sys-019

接続されているすべてのモニター情報(マルチモニター構成)を取得する方法を解説します。

前提条件

@tauri-apps/api パッケージが必要です。

Permissions (権限) の設定

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

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

1. フロントエンドから作成する (TypeScript)

@tauri-apps/api/windowavailableMonitors() 関数を使用します。
これは Monitor オブジェクトの配列を返します。

import { availableMonitors } from '@tauri-apps/api/window';

async function listMonitors() {
  try {
    const monitors = await availableMonitors();
    
    console.log(`モニター数: ${monitors.length}`);

    monitors.forEach((monitor, index) => {
      console.log(`--- Monitor #${index + 1} ---`);
      console.log(`Name: ${monitor.name}`);
      console.log(`Position: (${monitor.position.x}, ${monitor.position.y})`);
      console.log(`Size: ${monitor.size.width}x${monitor.size.height}`);
      console.log(`ScaleFactor: ${monitor.scaleFactor}`);
    });
    
  } catch (error) {
    console.error('モニター情報の取得に失敗:', error);
  }
}

listMonitors();

2. バックエンドから作成する (Rust)

Rust 側の tauri::Window インスタンスから、利用可能なすべてのモニター情報を取得できます。

Rust 実装

use tauri::{command, Window};

#[command]
fn get_monitors_from_rust(window: Window) -> Vec<String> {
    match window.available_monitors() {
        Ok(monitors) => monitors.iter().enumerate().map(|(i, m)| {
            format!(
                "Monitor #{}: {}x{} (Scale: {})", 
                i, m.size().width, m.size().height, m.scale_factor()
            )
        }).collect(),
        Err(_) => vec![],
    }
}

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

フロントエンドからの呼び出し

import { invoke } from '@tauri-apps/api/core';

invoke<string[]>('get_monitors_from_rust')
  .then(monitors => console.log('Monitors from Rust:', monitors))
  .catch(console.error);

availableMonitors は Window インスタンスメソッドではなく、トップレベルのエクスポート関数として提供される場合があります(バージョンによる)。上記は標準的な v2 API の例ですが、もし getCurrentWindow().availableMonitors() が必要な場合はそちらを使用してください。(最新 v2 では availableMonitorswindow 名前空間の関数です)