我正在尝试开发一个使用 sdl2 库的程序。到目前为止它工作得很好,但是当我运行该程序时,我得到两个窗口 - sdl2 窗口和控制台窗口。
如何隐藏或不创建控制台窗口?也许有某种
WinMain
?
Rust 1.18 引入了 Windows 子系统属性。关闭控制台:
#![windows_subsystem = "windows"]
当 Rust 二进制文件与 GCC 工具链链接时,要启动程序而不生成命令行窗口,我们需要 将
-mwindows
选项传递给链接器。
Cargo 有一个
cargo rustc
模式,可用于将额外的标志传递给 rustc
。在引入之前,没有已知的方法可以使用 Cargo 将选项传递给编译器。
当我们无法影响编译或链接到所需效果时,一种解决方法是在创建窗口后隐藏窗口:
fn hide_console_window() {
use std::ptr;
use winapi::um::wincon::GetConsoleWindow;
use winapi::um::winuser::{ShowWindow, SW_HIDE};
let window = unsafe {GetConsoleWindow()};
// https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-showwindow
if window != ptr::null_mut() {
unsafe {
ShowWindow(window, SW_HIDE);
}
}
}
我们需要 Cargo.toml 中的以下内容来编译示例:
[dependencies]
winapi = {version = "0.3", features = ["wincon", "winuser"]}
当我们从现有控制台或 IDE 运行程序时:
fn hide_console_window() {
unsafe { winapi::um::wincon::FreeConsole() };
}
如果我们从批处理文件启动应用程序,则第二种方法不起作用,因为批处理仍然拥有控制台并防止其消失。
很快,https://github.com/rust-lang/rust/pull/37501将会落地,这是RFC 1665的实现,正确答案将是
#![windows_subsystem = "windows"]
在你的板条箱根部。
如果您使用 MSVC 工具链,则添加到 Roman Quick 的答案中,您将需要传递 MSVC 链接器参数。
cargo rustc --release -- -Clink-args="/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup"
过了一段时间我找到了一个完美的答案! Cargo 现在有非常有用的子命令 -
rustc
。
完整的构建命令是这样的:
cargo rustc -- -Clink-args="-Wl,--subsystem,windows"
现在我们可以使用常规的
cargo build
来构建调试版本,当我们需要进行最终构建时,我们可以使用此命令:
cargo rustc --release -- -Clink-args="-Wl,--subsystem,windows"
如何隐藏或不创建控制台窗口?
您可能可以使用创建标志来指示没有窗口。
winapi = {version = "0.3.9", features = ["winbase"]}
use winapi::um::winbase::CREATE_NO_WINDOW;
let cmd = "run.bat";
Command::new(cmd).creation_flags(CREATE_NO_WINDOW).spawn().ok();