可算实现完了(
This commit is contained in:
parent
2c66abcf20
commit
03b32c5a56
@ -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"]
|
||||||
|
93
src/win.rs
93
src/win.rs
@ -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));
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user