diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index 64ad9398..69467319 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -218,3 +218,52 @@ pub fn is_msix() -> bool { } } } + +#[tauri::command] +pub fn is_process_running(process_name: String) -> bool { + #[cfg(not(target_os = "windows"))] + { + false + } + #[cfg(target_os = "windows")] + { + use windows_sys::Win32::Foundation::{CloseHandle, HANDLE, INVALID_HANDLE_VALUE}; + use windows_sys::Win32::System::Diagnostics::ToolHelp::{ + CreateToolhelp32Snapshot, PROCESSENTRY32W, Process32FirstW, Process32NextW, + TH32CS_SNAPPROCESS, + }; + unsafe { + // 创建进程快照 + let snapshot: HANDLE = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if snapshot == INVALID_HANDLE_VALUE { + return false; + } + + let mut entry: PROCESSENTRY32W = std::mem::zeroed(); + entry.dwSize = std::mem::size_of::() as u32; + + // 遍历进程列表 + if Process32FirstW(snapshot, &mut entry) != 0 { + loop { + // 将 exe 文件名转为 Rust String + let exe_name = { + let len = entry.szExeFile.iter().position(|&c| c == 0).unwrap_or(entry.szExeFile.len()); + String::from_utf16_lossy(&entry.szExeFile[..len]) + }; + + if exe_name.eq_ignore_ascii_case(&process_name) { + CloseHandle(snapshot); + return true; + } + + if Process32NextW(snapshot, &mut entry) == 0 { + break; + } + } + } + + CloseHandle(snapshot); + false + } + } +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index a4c76f5b..4dd5e061 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -14,7 +14,7 @@ mod yae; use crate::client::create_mhy_client; use crate::commands::{ create_window, execute_js, get_dir_size, hide_main_window, init_app, is_in_admin, is_msix, - launch_game, quit_app, read_text_scale, + is_process_running, launch_game, quit_app, read_text_scale, }; use tauri::{Emitter, Manager, Window, WindowEvent, generate_context, generate_handler}; @@ -110,6 +110,7 @@ pub fn run() { read_text_scale, launch_game, is_msix, + is_process_running, #[cfg(target_os = "windows")] yae::call_yae_dll, #[cfg(target_os = "windows")] diff --git a/src/pages/common/PageTest.vue b/src/pages/common/PageTest.vue index 83e3c0dd..72f0bae8 100644 --- a/src/pages/common/PageTest.vue +++ b/src/pages/common/PageTest.vue @@ -23,8 +23,6 @@