使用 windows_subsystem 时如何拥有隐藏控制台?

5 windows console stdout rust

我的目标是拥有它,这样当双击可执行文件时,不会生成控制台,但当用户从命令行启动它时,它也能够打印到控制台。

我将以下特定于 Windows 的代码设置为不生成控制台:

#![windows_subsystem = "windows"]
fn main() {
    println!("Hello world");
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,它永远不会将 stdout/stderr 挂钩到任何东西,因为它设置为在启动时不创建控制台。尽管如此,有什么办法可以实现我的目标吗?

She*_*ter 2

\n

这并不是 Rust 特有的,而是 Windows 的工作方式:您要么为“控制台”子系统编写,并且您的程序在没有控制台的情况下启动,要么为“windows”子系统和您的程序编写控制台如果从命令行启动,则将其自身与控制台分离。

\n

PATHEXTCLI shell 用于在搜索命令 \xe2\x80\x94 时添加的文件扩展名的环境变量 \ xe2 PATH\x80\x94 通常在“.EXE”之前包含“.COM”,在这种情况下,可以创建一个控制台具有“.com”文件扩展名的应用程序版本(例如“app.com”)。这可以是独立版本,也可以只是生成主可执行文件的启动器(例如“app.exe”,一个 GUI 应用程序)。启动器可以传递一个命令行选项,允许主应用程序通过AttachConsole.

\n

如果没有启动器,连接回控制台是一个坏主意,因为父应用程序(例如 CLI shell 或完整的 TUI 应用程序)通常不会等待 GUI 应用程序退出,在这种情况下,结果是混乱的交错 I/ O 有两个应用程序竞争访问权限。

\n