現在のマウスカーソル座標を取得する

Recipe ID: sys-020

スクリーン全体における現在のマウスカーソル座標(グローバル座標)を取得する方法を解説します。
JavaScript の mousemove イベントはウィンドウ内での座標しか取得できないため、画面全体の座標が必要な場合は Rust 側で取得します。

前提条件

特になし(カスタムコマンドとして実装します)。

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

Tauri の Window 構造体が持つ cursor_position() メソッドを使用します。
これはウィンドウに関連付けられたカーソル位置を返します。

Rust 実装

src-tauri/src/lib.rs:

use tauri::{command, Window};

#[derive(serde::Serialize)]
struct CursorPos {
    x: f64,
    y: f64,
}

#[command]
fn get_cursor_position(window: Window) -> Result<CursorPos, String> {
    // window.cursor_position() は Result<PhysicalPosition<f64>, ...> を返す
    let pos = window.cursor_position().map_err(|e| e.to_string())?;
    Ok(CursorPos { x: pos.x, y: pos.y })
}

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

2. フロントエンドから呼び出す (TypeScript)

Rust で定義したカスタムコマンド get_cursor_position を呼び出します。

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

async function showCursorPos() {
  try {
    const pos = await invoke<{x: number, y: number}>('get_cursor_position');
    console.log(`Cursor: (${pos.x}, ${pos.y})`);
  } catch (e) {
    console.error(e);
  }
}

// 例えばボタンを押した瞬間の座標を取得
showCursorPos();

※ 完全なグローバル座標(ウィンドウ外も含む常に更新される座標)を監視するには、Rust 側のイベントループや rdev などの外部クレートが必要になる場合がありますが、上記の方法で「アプリがアクティブな時」や「コマンド呼び出し時点」の座標は取得可能です。