我有一个Windows应用程序,它的图形用户界面是用Rust和winapi编写的.尽管它有图形用户界面,但它的行为就像一个控制台应用程序.当启动exe文件时,会弹出一个Command Prompt窗口,并从该窗口运行应用程序.这不是我想要的;应该打开一个主窗口,就像在所有真正的桌面应用程序中一样.我如何使用winapi在铁 rust 中实现这个目标?

我已经研究了一些 Select .您可以使用Taurigtk-rs开发Windows桌面应用程序,但这两种技术在用于Windows应用程序时都有缺点.可以找到更多选项here.我也试过互联网上可用的windows-rs samples,但它们都是带有图形用户界面的控制台应用程序,这不是我想要的.

我还注意到,C++桌面应用程序使用函数int APIENTRY wWinMain(...)作为入口点,而控制台应用程序使用int main(...),而wWinMain似乎在Rust winapi中不可用.

推荐答案

系统是否为新创建的进程分配控制台由特定于Windows的optional PE header中的Subsystem字段控制.该字段通过链接器的/SUBSYSTEM命令行选项填充.桌面应用程序的唯一相关参数是CONSOLEWINDOWS.前者指示系统在启动时分配控制台,而后者则不会.

您可以指示链接器从Rust代码中以WINDOWS子系统为目标,方法是将

#![windows_subsystem = "windows"]

属性(请参见windows-subsystem).

你会在windows箱的core_app个样品中找到一个这样的例子.

这是以WINDOWS子系统为目标的最方便的方式.您还可以显式传递链接器标志,例如,通过将以下重写放入.cargo/config.toml:

[build]
rustflags = [
    "-C", "link-arg=/SUBSYSTEM:WINDOWS",
]

这可能会起作用,也可能不起作用,这取决于您碰巧使用的链接器.因为链接器不是铁 rust 工具链的一部分,所以确保它在你身上起作用并产生预期的效果.


关于入口点的函数名称的说明:它与操作系统加载程序无关.无论如何,它甚至从未进入最终的可执行映像.PE映像只存储(基于映像的)AddressOfEntryPoint,该符号可以被命名为任何名称.

具体名称仅与生成各自的链接器输入所涉及的构建工具相关.

更多信息请点击此处:WinMain is just the conventional name for the Win32 process entry point.基本原则同样适用于Rust,特别是用户定义的入口点(fn main())实际上不是可执行文件的入口点这一方面.

Rust相关问答推荐

如何在Rust中实现Functor trait?

创建包含缺失值的框架

我如何在Rust中使用传递依赖中的特征?

为什么BitVec缺少Serialize trait?

修改切片/引用数组

当一个箱子有自己的依赖关系时,两个人如何克服S每箱1库+n箱的限制?

新创建的变量的绑定生存期

在Rust中显式装箱受生存期限制的转换闭包

无法定义名为&new&的关联函数,该函数的第一个参数不是self

字段类型为Boxed的 struct 的生存期必须超过static

如果包名称与bin名称相同,并且main.ars位于工作区的同一 crate 中,则无法添加对lib.ars的依赖

在macro_rule中拆分模块和函数名

Rust编译器似乎被结果类型与anyhow混淆

需要一个有序向量来进行 struct 初始化

为什么我的trait 对象类型不匹配?

Rust Serde 为 Option:: 创建反序列化器

为什么我不能克隆可克隆构造函数的Vec?

如何为返回正确类型的枚举实现 get 方法?

为什么 `ref` 会导致此示例*取消引用*一个字段?

您不能borrow 对只读值的可变引用