#[cfg(windows)]
#[allow(unsafe_code)]
pub fn background_detached(exe: &std::path::Path) -> std::io::Result<()> {
use std::ffi::OsString;
use std::os::windows::ffi::OsStrExt;
use windows_sys::Win32::Foundation::BOOL;
use windows_sys::Win32::System::Threading::{
CreateProcessW, CREATE_NEW_PROCESS_GROUP, DETACHED_PROCESS, PROCESS_INFORMATION, STARTUPINFOW,
};
let cmdline: Vec<u16> = OsString::from(format!("\"{}\" -w -d", exe.display()))
.encode_wide()
.chain(Some(0))
.collect();
let app_name: Vec<u16> = exe.as_os_str().encode_wide().chain(Some(0)).collect();
let mut si: STARTUPINFOW = unsafe { std::mem::zeroed() };
si.cb = std::mem::size_of::<STARTUPINFOW>() as u32;
let mut pi: PROCESS_INFORMATION = unsafe { std::mem::zeroed() };
let ok: BOOL = unsafe {
CreateProcessW(
app_name.as_ptr(), cmdline.as_ptr() as *mut u16, std::ptr::null_mut(), std::ptr::null_mut(), 0, DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP, std::ptr::null_mut(), std::ptr::null_mut(), &si,
&mut pi,
)
};
if ok == 0 {
return Err(std::io::Error::last_os_error());
}
unsafe {
windows_sys::Win32::Foundation::CloseHandle(pi.hProcess);
windows_sys::Win32::Foundation::CloseHandle(pi.hThread);
}
Ok(())
}