【问题标题】:How to make a program that does not display the console window?如何制作一个不显示控制台窗口的程序?
【发布时间】:2015-04-21 05:26:56
【问题描述】:

我正在尝试开发一个使用 sdl2 库的程序。到目前为止它工作得很好,但是当我运行程序时,我得到了两个窗口——sdl2 窗口和控制台窗口。

如何隐藏或不创建控制台窗口?也许有某种WinMain

【问题讨论】:

    标签: windows console rust


    【解决方案1】:

    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

    当我们不能影响编译或链接到想要的效果时,一种解决方法是在窗口创建后隐藏它:

    fn hide_console_window() {
        use std::ptr;
        use winapi::um::wincon::GetConsoleWindow;
        use winapi::um::winuser::{ShowWindow, SW_HIDE};
    
        let window = unsafe {GetConsoleWindow()};
        // https://docs.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() };
    }
    

    如果我们从批处理文件启动应用程序,则第二种方法不起作用,因为批处理仍然拥有控制台并防止其消失。

    【讨论】:

    • 感谢您提供如此有用的答案。我会等几个小时等待其他答案,如果没有更好的结果,我会接受你的:)
    • 当然,即使需要三年时间,我也会很高兴了解面糊解决方案。
    • @ArtemGr GetConsoleWindow 返回控制台窗口的句柄。
    • @FrancisGagné 和 ArtemGr 你们都摇滚!我已经用 GetConsoleWindow 尝试了后来的解决方案 - 它按预期工作。正在等待完全禁用创建控制台窗口的选项...
    • 这似乎完全禁用了控制台输出,因此从命令行运行可执行文件不会产生任何输出。我使用#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] 仅在使用--release 编译时禁用控制台
    【解决方案2】:

    很快,https://github.com/rust-lang/rust/pull/37501 就会落地,这是RFC 1665 的一个实现,正确答案是

    #![windows_subsystem = "windows"]
    

    在您的箱子根目录中。

    【讨论】:

    • 这在top answer中已经提到了。
    • 啊!我错过了
    【解决方案3】:

    添加到 Roman Quick 的答案,如果您使用的是 MSVC 工具链,您需要传递 MSVC 链接器参数。

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

    【讨论】:

      【解决方案4】:

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

      完整的构建命令是这样的:

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

      现在我们可以使用常规的cargo build 构建调试版本,当我们需要进行最终构建时,我们可以使用以下命令:

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

      【讨论】:

      • 此答案仅适用于您使用 GCC 而不是 MSVC 工具链的情况。如果您使用的是 MSVC 工具链,请参阅下面 GhotiPhud 的回答。
      猜你喜欢
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 2017-08-03
      • 2011-06-12
      • 2017-09-09
      • 2011-01-20
      • 2012-06-21
      • 2017-07-04
      相关资源
      最近更新 更多