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

问题描述 投票:0回答:5

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

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

WinMain

windows console rust
5个回答
61
投票

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

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


14
投票

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

#![windows_subsystem = "windows"]

在你的板条箱根部。


12
投票

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

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

9
投票

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

rustc

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

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

现在我们可以使用常规的

cargo build
来构建调试版本,当我们需要进行最终构建时,我们可以使用此命令:

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

0
投票

如何隐藏或不创建控制台窗口?

您可能可以使用创建标志来指示没有窗口。

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

是否可以使用标准库生成进程而不在 Windows 中显示控制台窗口?

© www.soinside.com 2019 - 2024. All rights reserved.