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

iqjalb3h  于 2023-11-19  发布在  其他
关注(0)|答案(5)|浏览(559)

我正在试着开发一个使用sdl 2库的程序,到目前为止它运行得很好,但是当我运行这个程序时,我得到了两个窗口-sdl 2窗口和控制台窗口。
如何隐藏或不创建控制台窗口?也许有某种WinMain

hi3rlvi2

hi3rlvi21#

Rust 1.18引入了一个Windows子系统属性。关闭控制台:

#![windows_subsystem = "windows"]

字符串
当Rust二进制文件与GCC工具链链接时,要在不产生命令行窗口的情况下启动程序,我们需要pass the -mwindows option to the linker
Cargo 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://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() };
}


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

6yoyoihd

6yoyoihd2#

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

#![windows_subsystem = "windows"]

字符串
在你的箱子里

chhqkbe1

chhqkbe13#

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

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

字符串

l7wslrjt

l7wslrjt4#

过了一段时间,我找到了一个完美的答案!Cargo现在有了非常有用的子命令-rustc
完整的build命令是这样的:

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

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

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

hyrbngr7

hyrbngr75#

如何隐藏或不创建控制台窗口?
您可以使用创建标志来指示没有窗口。

winapi = {version = "0.3.9", features = ["winbase"]}

个字符
Is it possible to use the standard library to spawn a process without showing the console window in Windows?

相关问题