如何制作一个不显示控制台窗口的程序?

38

我正在开发一个使用sdl2库的程序,目前它运行得非常完美,但是当我运行程序时,会出现两个窗口 - sdl2窗口和控制台窗口。

我该如何隐藏或不创建控制台窗口?也许有一种叫做WinMain的方法?

5个回答

62

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() };
}

这种第二种方法如果是从批处理文件启动应用程序则无法生效,因为批处理仍然拥有控制台并且会阻止其消失。

1
当然,我很乐意学习更好的解决方案,即使需要三年时间。 - ArtemGr
@ArtemGr GetConsoleWindow 返回控制台窗口的句柄。 - Francis Gagné
如果您从命令提示符或PowerShell启动程序,则调用GetConsoleWindow()和ShowWindow(SW_HIDE)将使控制台窗口消失(但不退出)。也许更好的方法是改为调用FreeConsole()。 - yonran
@yonran 很好的发现。虽然并不总是正确的做法,所以我都会提到两种情况。 - ArtemGr
6
似乎完全禁用了控制台输出,以至于从命令行运行可执行文件时不会产生任何输出。我使用 #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] 只在使用 --release 编译时禁用控制台。 - NyxCode
显示剩余5条评论

14

这已经在顶部答案中提到了。 - Shepmaster
啊!我错过了。 - Steve Klabnik
正如顶部答案的评论所提到的,“这似乎完全禁用了控制台输出,以至于从命令行运行可执行文件不会产生任何输出。” - Stefnotch

12

在Roman Quick的回答基础上,如果您使用MSVC工具链,您需要传递MSVC链接器参数。

cargo rustc --release -- -Clink-args="/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup"

9

经过一段时间的探索,我找到了一个完美的答案!Cargo现在有一个非常有用的子命令 - rustc

完整的构建命令如下:

cargo rustc -- -Clink-args="-Wl,--subsystem,windows"

现在我们可以使用普通的构建调试版本,当我们需要进行最终构建时,可以使用以下命令:
cargo rustc --release -- -Clink-args="-Wl,--subsystem,windows"

这个答案仅适用于使用GCC而不是MSVC工具链的情况。如果您正在使用MSVC工具链,请参见GhotiPhud的答案。 - Christopher Armstrong

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接