我正在try 开发一个使用sdl2库的程序.到目前为止,它工作得很好,但当我运行该程序时,我会看到两个窗口——sdl2窗口和console窗口.

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

推荐答案

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://docs.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() };
}

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

Rust相关问答推荐

在‘await’点上使用‘std::同步::Mutex’是否总是会导致僵局?

将已知大小的切片合并成一个数组,

如何导出 rust 色二进制文件中的符号

当两者都有效时,为什么Rust编译器建议添加';&;而不是';*';?

当rust中不存在文件或目录时,std::FS::File::Create().unwire()会抛出错误

rust 迹-内存管理-POP所有权-链表

如何正确地将App handler传递给Tauri中的其他模块?

获取与父字符串相关的&;str的原始片段

使用Rust WASM读取文件

在为第三方 struct 实现第三方特征时避免包装器的任何方法

通过异常从同步代码中产生yield 是如何工作的?

Rust 中的静态引用

一次不能多次borrow *obj作为可变对象

方法可以被误认为是标准特性方法

trait 对象指针的生命周期

具有在宏扩展中指定的生命周期的枚举变体数据类型

在 Rust 中,Weak 如何知道内部值何时被删除?

有没有办法隐藏类型定义?

Rust 内联 asm 中的向量寄存器:不能将 `Simd` 类型的值用于内联汇编

为移动和借位的所有组合实现 Add、Sub、Mul、Div