今天想做一个简单的小 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 ,尺寸小、单文件、无依赖都可以做到。

感谢大家的回复,思维开阔了很多,我确实有一点喜欢追求完美,但我相信很多喜欢编码的人都是这样。在写代码时,总会想到这代码能不能更简洁直观,编译出去的东西能否运行更快、体积更小、更漂亮。我是一个老 windows 开发了,写过的东西估计你们可能都用过,比如 10 年前最火的游戏都在用的某个 box ,我觉得我是喜欢写代码的。看到收藏数我就放心了,看来很多人可能有同样的疑惑。我为客户端开发感到遗憾,在 windows 的 GUI 开发上,这么多年微软的似乎都是停滞的,我们追求的体积小而美、快速、兼容性、加壳反破解等等,在微软看来似乎都是不值一提的,WPF 的 AOT 相关的提交,在几年前就有人提交代码上去了,直到上个月才被合进 main 分支,在微软看来,我们就是一群不肯进微软 Store 的小丑吧。可能终究还是要走向跨平台的目标,但是这个目标微软实现不了。最后,我觉得还是业务为先吧,适当放弃一些东西也不失为一种选择,还是先 Avalonia 了,再次感谢各位的建议!

使用了 avalonia 的 AOT ,将裁剪修改为如下,可以 AOT 后正常运行了 partial false然后根据 github.com/AvaloniaUI/Avalonia/issues/9503 的方法,将附带的三个 dll 用 lib 静态链接的方式引入 实现了完美的单文件 AOT ,文件编译后尺寸为 68M ,加 UPX 壳以后为 23M ,已基本符合了我的预期,启动速度也有了大幅的提升。

winform+webview2 挺符合你的需求吧,只需要一个 webview2 控件,ui 前端轮子足够用成本也低,逻辑全靠 C#,打包还不会像 cef 多一个浏览器内核,体积有保证

github.com/microsoft/windows-rs 和 github.com/tauri-apps/tauri

试试 abp.io

前端不熟,另外 webview2 必须装 edge ,如果自用还行,发出去给人用不一定有 edge ( win7 )。

tauri 吧,体积小

duilib+cef

哈哈哈,楼主总结的很到位,微软真的是不干人事 😂

MFC 创建的时候就可以选新的 office 风格了吧?实在不行你可以 webview2 ,相比 Electron 能省点地方。

duilib

楼上说的 webview2 就挺好,覆盖率已经很可观了,也符合你“尺寸小一些,不要有依赖,最好单文件”的要求

electron 吧 文件多久多呗 好在快速开发、没啥学习成本都

微软真的是不干人事,...,不知道能造福多少客户端开发我觉得微软就算愿意造福客户端开发也不会造福 2024 年想支持 Win7 的客户端开发吧

duilib 确实有可行性,除了没 c#的开发效率以外。

是的啊,新的 MAUI 就不支持 Win7 ,github 上也有人在喷,另外这玩意 AOT 也不怎么好用。

不跨平台 纠结这么多干嘛 直接.net wpf 一把梭,

太重了太重了,你想想写个启动器,加个远线程注入带点 http 请求,UI 就俩 TextBox 几个 Label 和按钮,这太重了。

编出去太大啊,太大了啊,独立包 100M 了

Windows GUI 最强的还是 Delphi ,可惜不是免费的。可以看一下 Lazarus 。

"小应用 GUI 想要尺寸小一些,不要有依赖,最好单文件"难道说的不是 ImGui ?

另外微软家的东西 ,业内都是嗤之以鼻的,基本上没几个能善终,好多都烂尾了一般技术选型,狗都不用微软家的技术silverlight RIP

aardio ?

aardio

如果会 Pascal 语言,也许可以试试 lazarus对于小工具够用了

delphi 还没死么,我 07 年上初中的时候,还用 delphi 写过 u 盘,inf 病毒的 查杀工具,当时很多老师的 u 盘插到教室的电脑 然后被病毒 g 了,我就弄了个 upan 查杀工具,当时还有 exe 伪装成 excel 图片,让人误点的,我帮教室里面的电脑 安装好几次的系统

怎么没看到 javafx

www.2ccc.com/ 这个网站 居然还没倒闭,牛逼

react-windows

选人多的qtelectronflutter

ImGui 看起来不错,有待研究一下!

golang + govcl ,轻量无依赖,打包完压缩后就几 M ,不依赖 Runtime, 开发简单的页面完全够了

我提一个:lvgl

C++ + Xaml Island ,相关依赖库都在系统中,可以做到小体积,不过至少需要 Win10 1809 才能用。

不过要弄成单文件的话得进行一些 hack ,可以参考 github.com/ysc3839/SingleExeXamlIsland

我刚想到一个另类一些的:Godot这玩意真的可以用来写软件,有一些例子: github.com/Orama-Interactive/Pixelorama github.com/RodZill4/material-maker github.com/MewPurPur/GodSVG github.com/mbrlabs/Lorien用 GDScript 写逻辑,开发效率也相当高。另外看了帖子回复,我觉得有个需要注意的坑:大多数用 GPU 绘图的 GUI 库,往往字体渲染都有很多坑。ImGUI 就有坑,比如不能渲染阿拉伯语……

既要又要还要更要,本来最符合的 Qt 被你直接 Pass 了

你不跨平台追求独立打包有什么意义吗。

qt 可以解决你所有的问题 可惜你不熟

Qt 的体积也比较大。其实要体积小的话,要不然就只能界面难看,要不然操作系统有自带依赖。那可选项就只有传统 Win32 控件、Xaml Island 、Edge WebView2 、.NET Framework 。传统 Win32 控件太难看。.NET WPF 自带的主题也不太好看,用第三方主题又会增加体积,不过看增加的大小,也许可以接受。WebView2 要好看也得用第三方 css 库,不过一般都能做得很小。所以最符合的基本就只有 Xaml Island 了。

试试 egui 或者 slint

界面如果不是很复杂,QT 学习起来该是比较舒适的

qt 不方便的话可以试试 pyqt,用 pyinstaller 打包完可以不超过 50M,或者用 python 内置的 tkinter 会更小

因为早在很多年前厂家们就没动力卷桌面 GUI 赛道了,更不要说 native GUI

何为重?何为轻?不要陷入到技术选型的漩涡当中,把业务做好才是正途。

AARDIO

唯一能满足你的只有 aardio ,优点如下:1.简单易学,有 Python 、php 、或者 JavaScript 之类的脚本语言经验的人,稍微看一下文档。初学者很容易就能学会2.支持 ui 自绘,可使用 html+css 定制非常美观的界面3.打包极小,一般的桌面小软件 3-5m 。且启动快4.示例代码丰富,文档完善,大部分模块代码已经封装好了,直接复制就能用,几行代码随随便便就能拼装出功能强大的软件

不追求新特性可以把 WPF/WinForm 的 TargetFramework 改成 .NET Framework 比如 net461 ,用系统自带的运行时也约等于无依赖了

传统 GUI 库除了 QT 还有很多啊,GTK+、wxWidgets 之类的,还有 www.fltk.org/如果不限语言的话,还有 www.tecgraf.puc-rio.br/iup/ 和 Tcl/Tk

需要纠结这种问题就无脑选 Electron ,因为你不可能比 Electron 做得好,如果你能比 Electron 做得好,那也就不会问这个问题了。

你这个要求也挺多了吧。。。要美观,要大小,要便携性,要性能,要开发速度,说说吧是什么你可以放弃的?什么?你都不想放弃?那还说你要求不高?

duilib 或者 cefview.

wails

python + tkinter + win32API 然后用 pyinstaller 打包, 需要加密的话用+ cythonpython + tkinter 写的应用优化打包后可以小于 10Mbpython + ctypes 调用 win32 DLL ,打包后小于 3Mb不要用用 python + qt这有一个用 python + ctypes 写的多窗口文件管理器,仅供参考: www.hesudu.com/t/911130#reply9

javafx 嘻嘻

webview2 吧,好像只要运行时就行了,不一定非要 edge 吧?我业余写着玩感觉这个是目前最好的选择了,会易的话,火山 pc 就有这个库

如果选 python + tkinter 的话,有图形化 UI 生成工具, visualtk.com/ github.com/alejandroautalan/pygubu-designer设计好 UI ,直接生成相关代码如果只在 win 平台用,打包时候+upx 压缩,体积更小 : github.com/upx/upx/releases/tag/v4.2.2如果没有调用很大很复杂的库,python + tkinter + win32 API + pyinstaller + upx 写的 GUI 应用可以 < 10Mb, 手动优化( trim 库)可以 < 5Mb 同样的代码,所使用的 python 版本不同会导致不同的打包大小py2.7 < py3.5 < py3.12

你这个要求有点过多了,但确实有一个满足你所有要求的,就是 github.com/yue/yue/blob/master/docs/guides/faq.md 可以静态链接,可以调用原生 Windows API ,完全自绘。如果你能接受原生控件的话,IUP 也是个好选择

#56> It means moon in Chinese该死的网络文化,我第一眼想到这项目名字有点像吐了

.net framework 为什么要独立打包,系统不都自带吗

github 上 windows GUI 轮子巨多,随便找一些来用用,效果都还行。不过好界面,最后还是要靠美术。

前端不熟还挑啥这个 UI 不好那个 UI 不好看,不管是 Web 前端还是桌面前端都是要开发自己有排版设计能力。懒鬼就直接找人家现成有 UI 的项目改改好了。

这么纠结,不如雇佣一个人来做,你不做有的是人做。不过看你应该是有洁癖

你的需求基本只能 C++ 实现。我在自己的开源项目里用的 C++/WinRT+XAML Islands+WinUI 2 ,效果挺好。优点是界面美观,没有外部依赖( HybridCRT 技术),纯框架体积不到 10M 。但单文件是做不到的,最少 4 个文件。

记得 MFC 在做窗体布局的时候,可以自己做(画?)控件的,(控件类的逻辑,继承后完全重写都能做到?? 好像自由度还是很大的,不记得太清晰了), 记得当时自画 mfc 控件的图和色,只能用 16 位的图(当时是 XP+VC2005),我自己在 XP +VC2003 上用 MFC 写的背单词软件,后来用在 vista 上,那窗体和按钮,非常素。。。。 MFC 编译后的 release 版,就算很几万行很复杂的逻辑,单文件内嵌静态编译,文件最多 3,4,5M 体积,甚是怀念。 可我毕业后就没干专职开发了,呵呵呵 MFC 是好东西。 微软就是狗。

WinUI3 不是最好的选择嘛?要 size 最小直接选 C++/WinRT. 印象里不会超过 1M 。

WPF 就算最终实现了 AOT ,体积仍然会很大,这跟 AOT 本身没关系。你又要 GUI 好看,又要占用小,那只能从底层控件开始自己手撸,结果你又不愿意撸,又想简便。你这个需求在哪个平台能完美实现?

如果 WPF 能 AOT 的话,参考 Form 目前已知的 AOT ,估计应该能在 20-30M ,然后上 UPX 壳,应该能在 10M 左右,还是很可观的。

我也是想骂,wpf 搞 aot 多好,最近开始研究 avalonia 了

可以实现单文件。不使用 WinUI 的情况下,用代码创建界面元素,就不需要 resources.pri 。要 resources.pri 的情况下,可以 hook 加载 resources.pri 的 DLL(印象中是 twinui.appcore.dll),让其加载内存中的数据。不过 hook 属于非正常手段,升级系统后可能出现问题,风险自担。方法参见 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 ,同时需要从文件加载数据,不过因为是开源的,可以改成静态链接以及从内存加载数据,就可以单文件了。

WinUI 3 不一定是最好的,目前最新的 Win11 似乎都没有内置 WinUI 3 ,就算通过 AppX 安装 WinUI 3 ,也少不了安装那一步。

pyqt pyside 应该满足你的条件,有个 fluentui 还不错

#18 我以前也用过 delphi 写过小工具,做 gui 超级简单,编译飞快,编译出来的程序也很小,主要问题就是不同版本的库不兼容。现在好像都没什么人用了。
不追求 AOT 的话你的选项会多很多

#56 考虑到作者是国人,很难说有没有故意的成分,哈哈

需要调用不少原生 Windows API ,想要尺寸小一些,不要有依赖,最好单文件同时满足这个需求,除了 delphi 没有第二家,只要你不申请软著,不会被国内代理盯上

linux 没这个需求,因为大部分程序不需要 GUI[手动狗头].想好看还想文件小,这个貌似只有 mfc 、wtl 。哦对,忘了 delphi 了,微信和 foxmail 的巅峰之作。

winform 还好吧,简单粗暴体积小

没人提 sciter ? 6M 大小,html + js + css 开发 ui ,有接口可以和原生语言交互,如 c ,rust 等。甚至支持 XP 。主要的坑在于 css 和 api 是自己的一套东西,和标准不一样。几年前 js 也是自己的,后来 quickjs 出来后换 quickjs 了,开发体验提升很多。拿来开发过几个小工具,开发体验比较差,但引擎本身挺强的。

.net Aot 被裁剪运行不起来,配个 rd.xml 加上类型就行了,很简单。

奔驰 特斯拉 等很多车机上的 ui 用的 qt

go+web

IMGUI

关于 Avalonia 独立发布后有三个 dll 的问题,在解决方案加上这个就可以了 <AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>Avalonia 不依赖框架打包的得六七十兆,的确有点大我在树莓派 3b 上运行,启动得好几秒

slint ?可以了解一下,可以使用 c++, js, rust 开发

nuklear ,用 gdi 后端,无依赖,尺寸小,单文件 github.com/Immediate-Mode-UI/Nuklear/

pyside pyqt

wxwidgets

试试wails,程序嵌套了个 webview ,ui 界面套一些开源组件库绝对杠杠的,在配合 go 写一些简单的后端业务逻辑,打包出去最小的可执行文件也只有 10MB 左右。

Avalonia 挺好用... 我做了几个小项目了...

你熟悉哪个就用哪个,不要纠结这种东西,有时间纠结还不如花点时间在业务上。

我以前直接在本地起个端口做成 web 服务用默认浏览器,系统里浏览器总是有的

miniblink

易语言: 我真的很伤心

前几天自学 winforms 做了个应用启动器,感觉简单好用,好不好看就无所谓了

好像 Delphi 现在的公司 Embarcadero 推出了社区版,是可以免费使用的: www.embarcadero.com/products/delphi/starter/free-download

wails + 1 主程序 golang , 界面支持各前端技术栈;golang 原生跨平台,前端技术界面便捷/丰富程度也非其他可比;

如果喜欢用 H5 做界面,可以试试这个 webui.me/ 。用本地浏览器作为 UI 界面,业务逻辑可以用 C/C++/Go 等开发

纯微软平台的,似乎 aardio 真不错

商业化每年收入超过 5000 刀就得付费了,还不如直接用 Lazarus

#69 不知道微软怎么想的。明明自己的系统组件都有用 winui3 写的了,然而我自己写一个小的程序,在系统上执行却需要额外再安装一下运行库,而不能用系统自带的。

刚看到标题就想起易语言,没想到楼主真是考虑了哈哈