use std::ffi::CStr;
use windows::Win32::{
Foundation::CloseHandle,
System::Diagnostics::ToolHelp::{
CreateToolhelp32Snapshot, PROCESSENTRY32, Process32First, Process32Next, TH32CS_SNAPPROCESS,
},
};
pub fn is_process_running(process_name: &str) -> bool {
unsafe {
let snapshot = match CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) {
Ok(handle) => handle,
Err(_) => return false,
};
let mut entry = PROCESSENTRY32 {
dwSize: size_of::<PROCESSENTRY32>() as u32,
..Default::default()
};
let mut found = false;
if Process32First(snapshot, &mut entry).is_ok() {
loop {
let exe_name = CStr::from_ptr(entry.szExeFile.as_ptr())
.to_string_lossy()
.to_string();
if exe_name.eq_ignore_ascii_case(process_name) {
found = true;
break;
}
if Process32Next(snapshot, &mut entry).is_err() {
break;
}
}
}
match CloseHandle(snapshot) {
Ok(_) => return found,
Err(_) => return false,
}
}
}