📌
Tauriでwindows-rsクレートを使ってWebViewとは別にメッセージボックスを表示する
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