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

时间:2015-04-21 05:26:56

标签: windows console rust

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

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

4 个答案:

答案 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"