我正在尝试开发一个使用sdl2库的程序。它到目前为止工作得很好,但是当我运行程序时,我得到两个窗口 - sdl2窗口和控制台窗口。
如何隐藏或不创建控制台窗口?也许有某种WinMain
?
答案 0 :(得分:18)
Rust 1.18引入了Windows子系统属性。使用以下命令关闭控制台:
#![windows_subsystem = "windows"]
Rust二进制文件与GCC工具链相关联。要在不生成命令行窗口的情况下启动程序,您需要pass the -mwindows
option to the linker。
货物has a cargo rustc
mode,可用于将额外的标记传递给rustc
。在此之前,there was no known way to pass an option to the compiler with Cargo。
在这些情况下,一种解决方法是在创建窗口后隐藏窗口:
extern crate winapi;
extern crate user32;
extern crate kernel32;
use std::ptr;
fn hide_console_window() {
let window = unsafe {kernel32::GetConsoleWindow()};
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms633548%28v=vs.85%29.aspx
if window != ptr::null_mut() {
unsafe {
user32::ShowWindow(window, winapi::SW_HIDE);
}
}
}
您需要在Cargo.toml中进行以下编译:
[dependencies]
winapi = "*"
user32-sys = "*"
kernel32-sys = "*"
要从现有的控制台或IDE运行它:
fn hide_console_window() {
unsafe { kernel32::FreeConsole() };
}
第二种方法对我不起作用,因为我从批处理文件启动我的应用程序。你看,批处理仍然拥有控制台,所以它在屏幕上保持外观。
答案 1 :(得分:8)
过了一段时间,我找到了一个完美的答案!
货物现在有非常有用的子命令 - rustc
。
完整构建命令是这样的:
cargo rustc -- -Clink-args="-Wl,--subsystem,windows"
现在我们可以使用常规cargo build
构建调试版本,当我们需要进行最终构建时,我们可以使用此命令:
cargo rustc --release -- -Clink-args="-Wl,--subsystem,windows"
答案 2 :(得分:8)
很快,https://github.com/rust-lang/rust/pull/37501将降落,这是RFC 1665的实施,正确答案将是
#![windows_subsystem = "windows"]
在你的箱子里。
答案 3 :(得分:6)
如果你正在使用MSVC工具链,那么添加到Roman Quick的答案你会想要传递MSVC链接器args。
cargo rustc --release -- -Clink-args="/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup"