Windows 下开发小应用 GUI,真的很难选方案

2024-01-04 17:52:37 +08:00
 feirisu
今天想做一个简单的小 exe ,需要调用不少原生 Windows API ,想要尺寸小一些,不要有依赖,最好单文件。
其次,UI 不想要 Win32 原生控件。

没想到在 2024 年的今天,这个看似简单的问题是如此难找到一个完美符合要求的。

1.c++ win32 原生,CreateWindow 后面要设 Font 、所有事件自己从处理循环里接。
2.c++ MFC ,想要 UI 好看,Pass 。
3.c#的 WPF ,是很方便,也有很多 UI 库,但是目前不能 AOT (正式版本),独立打包直接去到 100+M ,Pass 。
4.c#的 Form ,UI 不好看,打包也很大,可以 AOT 但是基本是空程序才行,稍微复杂点因为 AOT 隐式启用裁剪,复杂点的代码就会启动不了。
5.c#的 Avalonia ,UI 还行,和 Form 一样 AOT 后有可能启动不了,独立打包 60-80M 也有点大,独立的也还另外带 3 个 DLL ,最难受的是启动很慢,需要 2-3 秒左右的时间才出窗口。
6.QT ,不熟 Pass 。
7.MAUI(WINUI),都不想提。
8.electron ,一堆文件,太重了。
9.flutter ,需要很多原生代码,还是得自己写 c++,两头折腾,尺寸倒是比 c#的那几个小不少。
10.易语言,会,但真的不想用。

微软真的是不干人事,老老实实把 WPF 的 AOT 做好,不知道能造福多少客户端开发。

想来想去,不如控制台得了,除了没 GUI ,尺寸小、单文件、无依赖都可以做到。
24978 次点击
所在节点    程序员
123 条回复
James369
2024-01-04 21:14:22 +08:00
这么纠结,不如雇佣一个人来做,你不做有的是人做。不过看你应该是有洁癖
blinue
2024-01-04 21:24:47 +08:00
你的需求基本只能 C++ 实现。我在自己的开源项目里用的 C++/WinRT+XAML Islands+WinUI 2 ,效果挺好。优点是界面美观,没有外部依赖( HybridCRT 技术),纯框架体积不到 10M 。但单文件是做不到的,最少 4 个文件。
qazwsxkevin
2024-01-04 22:03:52 +08:00
记得 MFC 在做窗体布局的时候,可以自己做(画?)控件的,(控件类的逻辑,继承后完全重写都能做到?? 好像自由度还是很大的,不记得太清晰了),
记得当时自画 mfc 控件的图和色,只能用 16 位的图(当时是 XP+VC2005),我自己在 XP +VC2003 上用 MFC 写的背单词软件,后来用在 vista 上,那窗体和按钮,非常素。。。。
MFC 编译后的 release 版,就算很几万行很复杂的逻辑,单文件内嵌静态编译,文件最多 3,4,5M 体积,甚是怀念。
可我毕业后就没干专职开发了,呵呵呵
MFC 是好东西。
微软就是狗。
felixlong
2024-01-04 22:14:47 +08:00
WinUI3 不是最好的选择嘛?要 size 最小直接选 C++/WinRT. 印象里不会超过 1M 。
acctv2
2024-01-04 22:15:28 +08:00
WPF 就算最终实现了 AOT ,体积仍然会很大,这跟 AOT 本身没关系。

你又要 GUI 好看,又要占用小,那只能从底层控件开始自己手撸,结果你又不愿意撸,又想简便。你这个需求在哪个平台能完美实现?
aiqinxuancai
2024-01-04 22:28:21 +08:00
@acctv2 如果 WPF 能 AOT 的话,参考 Form 目前已知的 AOT ,估计应该能在 20-30M ,然后上 UPX 壳,应该能在 10M 左右,还是很可观的。
zggsong
2024-01-04 22:31:00 +08:00
我也是想骂,wpf 搞 aot 多好,最近开始研究 avalonia 了
ysc3839
2024-01-04 22:32:24 +08:00
@blinue 可以实现单文件。
不使用 WinUI 的情况下,用代码创建界面元素,就不需要 resources.pri 。
要 resources.pri 的情况下,可以 hook 加载 resources.pri 的 DLL(印象中是 twinui.appcore.dll),让其加载内存中的数据。不过 hook 属于非正常手段,升级系统后可能出现问题,风险自担。方法参见 https://github.com/ysc3839/SingleExeXamlIsland
要 WinUI 2 的情况下,如果是 Win11 ,可以用 AddPackageDependency 引入系统中已安装的 WinUI 2 AppX 包,甚至可以引入系统内置的 WinUI 2 包 ("Microsoft.UI.Xaml.CBS_8wekyb3d8bbwe"),不过当然也是风险自担。
要 WinUI 2 的情况下,如果是 Win10 ,我之前调查过,似乎是只能把 WinUI 2 的 DLL 和 resources.pri 放到 exe 目录下,除非是打包成 AppX 并添加 WinUI 2 AppX 包的依赖,否则只能自己附带 WinUI 2 。不过可以考虑 Win10 下不用 WinUI 2 ,Win11 下才用。
上述“用代码创建界面元素”有个衍生方案,那就是用 React Native for Windows ,因为 React Native 就是纯代码创建元素的。之前测试没记错的话 React Native for Windows 的 DLL 只有 2MB 。原版 React Native for Windows 是独立的 DLL ,同时需要从文件加载数据,不过因为是开源的,可以改成静态链接以及从内存加载数据,就可以单文件了。
ysc3839
2024-01-04 22:34:03 +08:00
@felixlong WinUI 3 不一定是最好的,目前最新的 Win11 似乎都没有内置 WinUI 3 ,就算通过 AppX 安装 WinUI 3 ,也少不了安装那一步。
MrLia0
2024-01-04 22:34:33 +08:00
pyqt pyside 应该满足你的条件,有个 fluentui 还不错
linuxgo
2024-01-04 22:54:58 +08:00
@Hellert #18 我以前也用过 delphi 写过小工具,做 gui 超级简单,编译飞快,编译出来的程序也很小,主要问题就是不同版本的库不兼容。现在好像都没什么人用了。

kenvix
2024-01-04 23:03:07 +08:00
不追求 AOT 的话你的选项会多很多
minami
2024-01-04 23:08:03 +08:00
@0o0O0o0O0o #56 考虑到作者是国人,很难说有没有故意的成分,哈哈
mumbler
2024-01-04 23:26:10 +08:00
需要调用不少原生 Windows API ,想要尺寸小一些,不要有依赖,最好单文件

同时满足这个需求,除了 delphi 没有第二家,只要你不申请软著,不会被国内代理盯上
asm
2024-01-04 23:34:50 +08:00
linux 没这个需求,因为大部分程序不需要 GUI[手动狗头].

想好看还想文件小,这个貌似只有 mfc 、wtl 。哦对,忘了 delphi 了,微信和 foxmail 的巅峰之作。
Ritr
2024-01-04 23:41:32 +08:00
winform 还好吧,简单粗暴体积小
yixiang
2024-01-04 23:57:17 +08:00
没人提 sciter ? 6M 大小,html + js + css 开发 ui ,有接口可以和原生语言交互,如 c ,rust 等。甚至支持 XP 。

主要的坑在于 css 和 api 是自己的一套东西,和标准不一样。几年前 js 也是自己的,后来 quickjs 出来后换 quickjs 了,开发体验提升很多。

拿来开发过几个小工具,开发体验比较差,但引擎本身挺强的。
ggvoking
2024-01-05 01:01:02 +08:00
.net Aot 被裁剪运行不起来,配个 rd.xml 加上类型就行了,很简单。
memorycancel
2024-01-05 02:05:47 +08:00
奔驰 特斯拉 等很多车机上的 ui 用的 qt
rm0gang0rf
2024-01-05 08:13:43 +08:00
go+web

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1005903

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX