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

Rev*_*ron 16 windows console rust

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

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

Art*_*mGr 19

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

#![windows_subsystem = "windows"]
Run Code Online (Sandbox Code Playgroud)

Rust二进制文件与GCC工具链相关联.要在不生成命令行窗口的情况下启动程序,需要-mwindows选项传递给链接器.

Cargo 有一种cargo rustc模式可用于传递额外的标志rustc.在介绍之前,没有已知的方法将选项传递给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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您需要在Cargo.toml中进行以下编译:

[dependencies]
winapi = "*"
user32-sys = "*"
kernel32-sys = "*"
Run Code Online (Sandbox Code Playgroud)

要使其能够从现有的控制台或IDE运行它:

fn hide_console_window() {
    unsafe { kernel32::FreeConsole() };
}
Run Code Online (Sandbox Code Playgroud)

第二种方法对我不起作用,因为我从批处理文件启动我的应用程序.你看,批处理仍然拥有控制台,所以它保持在屏幕上的外观.

  • 这似乎完全禁用了控制台输出,以便从命令行运行可执行文件不会产生任何输出。我使用 `#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]` 仅在使用 `--release` 编译时禁用控制台 (5认同)

Rev*_*ron 8

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

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

cargo rustc -- -Clink-args="-Wl,--subsystem,windows"
Run Code Online (Sandbox Code Playgroud)

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

cargo rustc --release -- -Clink-args="-Wl,--subsystem,windows"
Run Code Online (Sandbox Code Playgroud)


Ste*_*nik 8

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

#![windows_subsystem = "windows"]
Run Code Online (Sandbox Code Playgroud)

在您的箱子根.


Gho*_*hud 7

如果您使用MSVC工具链,则需要添加到Roman Quick的答案,而是要传递MSVC链接器args.

cargo rustc --release -- -Clink-args="/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup"
Run Code Online (Sandbox Code Playgroud)