📌

Tauriでwindows-rsクレートを使ってWebViewとは別にメッセージボックスを表示する

2024/10/23に公開

window-rsクレートは、内部でwindowsとwindows-sysの2種類のクレートを使用している。

windowsクレートを使う場合

Cargo.toml
[dependencies.windows]
version = "0.58.0"
features = [
    "Win32_UI_WindowsAndMessaging",
]
lib.rs
use windows::core::PCSTR;
use windows::Win32::UI::WindowsAndMessaging::{MessageBoxA, MB_OK};

#[tauri::command]
fn show_message_box() {
    unsafe {
        let title = "Title\0";
        let message = "Message\0";
        MessageBoxA(None, PCSTR(message.as_ptr()), PCSTR(title.as_ptr()), MB_OK);
    }
}

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .plugin(tauri_plugin_shell::init())
        // フロントエンドからshow_message_boxを呼ぶ
        .invoke_handler(tauri::generate_handler![greet, show_message_box])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

windows-sysクレートを使う場合

Cargo.toml
[dependencies.windows-sys]
version = "0.59"
features = [
    "Win32_Foundation",
    "Win32_Security",
    "Win32_System_Threading",
    "Win32_UI_WindowsAndMessaging",
]
lib.rs
use windows_sys::{
    core::*, Win32::Foundation::*, Win32::System::Threading::*, Win32::UI::WindowsAndMessaging::*,
};

#[tauri::command]
fn show_message_box() {
    unsafe {
        let event = CreateEventW(std::ptr::null(), 1, 0, std::ptr::null());
        SetEvent(event);
        WaitForSingleObject(event, 0);
        CloseHandle(event);
        MessageBoxA(0 as _, s!("Message"), s!("Title"), MB_OK);
    }
}

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .plugin(tauri_plugin_shell::init())
        // フロントエンドからshow_message_boxを呼ぶ
        .invoke_handler(tauri::generate_handler![greet, show_message_box])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

Discussion