可算实现完了(

This commit is contained in:
shenjack 2024-01-21 19:46:02 +08:00
parent 2c66abcf20
commit 03b32c5a56
Signed by: shenjack
GPG Key ID: 7B1134A979775551
2 changed files with 74 additions and 21 deletions

View File

@ -13,4 +13,4 @@ codegen-units = 1
[target.'cfg(windows)'.dependencies.winapi] [target.'cfg(windows)'.dependencies.winapi]
version = "0.3" version = "0.3"
features = ["winuser", "wincon", "processthreadsapi"] features = ["winuser", "wincon", "winbase", "consoleapi"]

View File

@ -1,5 +1,20 @@
use crate::config::Config; use crate::config::Config;
use winapi::um::wincon; use std::{os::windows::process::CommandExt, process::Command};
use winapi::um::{processthreadsapi, wincon, winuser};
fn is_launched_from_console() -> bool {
unsafe {
let console_window = wincon::GetConsoleWindow();
if console_window.is_null() {
return false;
}
let mut console_process_id: u32 = 0;
winuser::GetWindowThreadProcessId(console_window, &mut console_process_id);
console_process_id != processthreadsapi::GetCurrentProcessId()
}
}
fn free_console() { fn free_console() {
unsafe { unsafe {
@ -7,28 +22,66 @@ fn free_console() {
} }
} }
pub fn call_bin(config: &Config) { fn hide_window() {
unsafe {
let _hwnd = winuser::GetForegroundWindow();
winuser::ShowWindow(_hwnd, winuser::SW_HIDE);
}
}
fn show_window() {
unsafe {
let _hwnd = winuser::GetForegroundWindow();
winuser::ShowWindow(_hwnd, winuser::SW_SHOW);
}
}
pub fn call_bin(config: &Config, started_from_console: bool) {
// 如果从终端启动, 且没指定显示终端, 则隐藏 stdout
if started_from_console {
if config.show_console {
println!("show_window with stdout");
let exit_status = Command::new(&config.bin)
.args(&config.bin_arg)
.status()
.expect("执行失败");
if !exit_status.success() {
println!("Exit with error code: {}", exit_status.code().unwrap());
}
} else {
println!("show_window without stdout");
let _out = Command::new(&config.bin)
.args(&config.bin_arg)
.output()
.expect("执行失败");
}
} else {
println!("hide_window");
// 调用可执行文件
let mut child = Command::new(&config.bin)
.args(&config.bin_arg)
.stdin(std::process::Stdio::inherit())
.stdout(std::process::Stdio::inherit())
.stderr(std::process::Stdio::inherit())
.creation_flags(winapi::um::winbase::CREATE_NO_WINDOW)
.spawn()
.expect("执行失败");
free_console();
hide_window();
child.wait().expect("等待失败");
}
// 重新显示终端 (以防万一)
show_window();
}
pub fn run(config: &Config) {
// 先切换工作目录 // 先切换工作目录
if let Some(chdir) = config.chdir.as_ref() { if let Some(chdir) = config.chdir.as_ref() {
std::env::set_current_dir(chdir).unwrap(); std::env::set_current_dir(chdir).unwrap();
} }
// 检测一下是否是从控制台启动的
let started_from_console = is_launched_from_console();
// std::thread::sleep(std::time::Duration::from_secs(1));
// 调用可执行文件 // 调用可执行文件
std::process::Command::new(&config.bin) call_bin(&config, started_from_console);
.args(&config.bin_arg)
.spawn()
.expect("执行失败");
free_console();
}
pub fn run(config: &Config) {
println!("先睡两秒为敬");
// 先睡两秒为敬
std::thread::sleep(std::time::Duration::from_secs(2));
println!("睡醒了");
// 尝试 FreeConsole 看看
// free_console();
println!("FreeConsole 了");
// 调用可执行文件
call_bin(&config);
std::thread::sleep(std::time::Duration::from_secs(2));
} }