我正在开发一个使用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"]}
fn hide_console_window() {
unsafe { winapi::um::wincon::FreeConsole() };
}
很快,https://github.com/rust-lang/rust/pull/37501将会推出,它是RFC 1665的一种实现,正确答案将会呈现。
#![windows_subsystem = "windows"]
在你的 crate 根目录中。在Roman Quick的回答基础上,如果您使用MSVC工具链,您需要传递MSVC链接器参数。
cargo rustc --release -- -Clink-args="/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup"
经过一段时间的探索,我找到了一个完美的答案!Cargo现在有一个非常有用的子命令 - rustc
。
完整的构建命令如下:
cargo rustc -- -Clink-args="-Wl,--subsystem,windows"
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();
GetConsoleWindow
返回控制台窗口的句柄。 - Francis Gagné#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
只在使用--release
编译时禁用控制台。 - NyxCode