fxkit 0.1.3

Useful utilities for writting Rust CLI tools
Documentation
use std::ffi::CStr;
use windows::Win32::{
    Foundation::CloseHandle,
    System::Diagnostics::ToolHelp::{
        CreateToolhelp32Snapshot, PROCESSENTRY32, Process32First, Process32Next, TH32CS_SNAPPROCESS,
    },
};

/// Check if a process is running
///
/// ## Example
/// ```rust
/// use fxkit::core::tools::process_running::windows::is_process_running;
/// if is_process_running("firefox") {
///     // Code
/// }
/// ```
///
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,
        }
    }
}