V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
feirisu
V2EX  ›  程序员

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

  •  3
     
  •   feirisu · 356 天前 · 19528 次点击
    这是一个创建于 356 天前的主题,其中的信息可能已经有所发展或是发生改变。
    今天想做一个简单的小 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 ,尺寸小、单文件、无依赖都可以做到。
    第 1 条附言  ·  355 天前
    感谢大家的回复,思维开阔了很多,我确实有一点喜欢追求完美,但我相信很多喜欢编码的人都是这样。在写代码时,总会想到这代码能不能更简洁直观,编译出去的东西能否运行更快、体积更小、更漂亮。

    我是一个老 windows 开发了,写过的东西估计你们可能都用过,比如 10 年前最火的游戏都在用的某个 box ,我觉得我是喜欢写代码的。

    看到收藏数我就放心了,看来很多人可能有同样的疑惑。

    我为客户端开发感到遗憾,在 windows 的 GUI 开发上,这么多年微软的似乎都是停滞的,我们追求的体积小而美、快速、兼容性、加壳反破解等等,在微软看来似乎都是不值一提的,WPF 的 AOT 相关的提交,在几年前就有人提交代码上去了,直到上个月才被合进 main 分支,在微软看来,我们就是一群不肯进微软 Store 的小丑吧。

    可能终究还是要走向跨平台的目标,但是这个目标微软实现不了。

    最后,我觉得还是业务为先吧,适当放弃一些东西也不失为一种选择,还是先 Avalonia 了,再次感谢各位的建议!
    第 2 条附言  ·  355 天前
    使用了 avalonia 的 AOT ,将裁剪修改为如下,可以 AOT 后正常运行了

    <TrimMode>partial</TrimMode>
    <TrimmerSingleWarn>false</TrimmerSingleWarn>

    然后根据 https://github.com/AvaloniaUI/Avalonia/issues/9503 的方法,将附带的三个 dll 用 lib 静态链接的方式引入

    <ItemGroup>
    <DirectPInvoke Include="libHarfBuzzSharp" />
    <NativeLibrary Include="native\libHarfBuzzSharp.lib" Condition="$(RuntimeIdentifier.StartsWith('win'))" />
    <DirectPInvoke Include="libSkiaSharp" />
    <NativeLibrary Include="native\libSkiaSharp.lib" Condition="$(RuntimeIdentifier.StartsWith('win'))" />
    <DirectPInvoke Include="av_libglesv2" />
    <NativeLibrary Include="native\av_libglesv2.lib" Condition="$(RuntimeIdentifier.StartsWith('win'))" />
    </ItemGroup>

    实现了完美的单文件 AOT ,文件编译后尺寸为 68M ,加 UPX 壳以后为 23M ,已基本符合了我的预期,启动速度也有了大幅的提升。
    第 3 条附言  ·  246 天前
    哈哈!干!最后用基于.Net Framework 4.6.2 的 WPF 重写了,反正用户不多,基本也都是新版 win10 ,默认都是自带了这个版本的.Net Framework 的。

    说起来也挺搞笑的,为了 AOT ,最后不要 AOT 。
    123 条回复    2024-07-21 14:54:56 +08:00
    1  2  
    ysc3839
        101
    ysc3839  
       355 天前 via Android
    @PrinceofInj Win11 正式版还没有 WinUI 3 ,仅仅是测试版有
    allenby
        102
    allenby  
       355 天前 via Android
    qt 不错
    f14g
        103
    f14g  
       355 天前 via Android
    aardio
    cway
        104
    cway  
       355 天前
    不如用老古董 vb6 ,文件小,不依赖.net
    NobodyVe2x
        105
    NobodyVe2x  
       355 天前
    gxvsko
        106
    gxvsko  
       355 天前
    WalterHs
        107
    WalterHs  
       355 天前
    Kotlin Compose 跨平台
    chuhades
        108
    chuhades  
       355 天前
    weeei
        109
    weeei  
       355 天前
    为什么你的方案里有 MFC ,却没有 WTL ?
    Ethkuil
        110
    Ethkuil  
       355 天前
    - winform
    - webview2, 用 Web 写 GUI

    「 Windows 小应用」,对我来说,超过 10MB 都不能算轻便了……
    dianso
        111
    dianso  
       355 天前
    GO+WEBVIEW2
    andytao
        112
    andytao  
       355 天前
    GLib/GTK + Vala(C# 原生版)写跨平台应用挺好的呀

    袋鼠数据库工具 使用的技术栈依赖情况如下:
    ================================================
    袋鼠数据库工具 Multiple (开发版) 4.0.0.240104
    系统平台
    Windows 11 22H2
    编译器
    Vala 0.56.13
    GCC 13.2.0
    核心库
    GLib 2.78.1
    JSON-GLib 1.8.0
    libsoup 2.74.3
    OpenSSL 3.1.4
    GTK 4.12.4
    libadwaita 1.4.0
    libpanel 1.4.0
    GtkSourceView 5.10.0
    数据库连接库
    sqlite3mc 1.8.1
    libmysqlclient 3.1.13
    libmariadb 3.1.13
    libpq 16.1
    dblib 1.4.8
    hiredis 1.2.0
    nananqujava
        113
    nananqujava  
       355 天前
    winform 或者 WPF
    miaomiao888
        114
    miaomiao888  
       355 天前
    既然提到了易语言,不如试试炫语言?这早期是个界面库,之后又加了个 IDE ,应该能满足你对界面美观又体积小的要求,性能的话本身也是基于 C++,应该没啥区别。
    wjd2002
        115
    wjd2002  
       355 天前
    Delphi 可以,小、快,基本不需要其它 Dll ,有很多第三方美化 UI ,只有一个前提,得会 pascal 。
    leqoqo
        116
    leqoqo  
       355 天前
    windows 7 好像就自带.net framework 2 了, 或者考虑考虑早期的 飞信内置虚拟机
    s7964926
        117
    s7964926  
       355 天前
    我也一直在考虑 Windows 到底用什么去开发, 后来选择了 C++ 和 Qt ,原因无他,比较方便。
    界面啥的我也已经不做要求了……能跑就行,但是一堆文件在软件根目录看起来真的很恶心。
    楼主最后选择的是啥?我准备把我的小翻译器也重构下。
    feirisu
        118
    feirisu  
    OP
       355 天前
    @s7964926 c#加 avalonia 的 AOT 方案,具体实施文章有补充
    ikas
        119
    ikas  
       355 天前
    c++ 调用原生 winui3 ui 不行么,我的一个 app,秒启动,启动后内存 30M..打包那就更小了
    openmynet
        120
    openmynet  
       355 天前
    rust 的 iced ,优点:尺寸小、单文件、无依赖,UI 可以做到很漂亮,跨平台;缺点:得会 rust ,目前多窗口好像还没有。awesome-iced 下列举了一些在使用 iced 开源项目
    loginv2
        121
    loginv2  
       354 天前
    Lazarus
    pollux
        122
    pollux  
       350 天前
    python + tkinter ,要美化用 ttkbootstrap 或者 customtkinter ,8~10M 左右不香吗?
    ko1haha
        123
    ko1haha  
       157 天前
    Electron , 你甚至能用 vscode 的运行时启动你的页面,大家是不是没看过官网文档啊……

    Electron 天生支持一个运行时启动不同 app 。 ( 就是开发时的启动模式

    这是自带的!
    这是自带的!
    这是自带的!


    普通 html:直接写个普通页面也能解决部分开发中的需求~

    浏览器扩展:弥补浏览器功能,可以做很多功能出来。

    ---

    传统:c++ duilib 但要自己会改库,基本上等同于原生开发。或者找个 direct2d 的库,做动画很炫酷。

    QT: 比如 db browser sqlite 你可以试试,还不错。

    IMGUI:字体是个问题,建议魔改成用 skia 绘制。

    java swing / javafx:java 系自然有些爆款软件比如 idea ,jadx, xtream download 等等。
    我也喜欢 java ,但不喜欢做 java 的 ui ,当脚本用好了。

    WPF:复杂项目一定要用 rider ,架不住 IDE nb !


    ---

    甚至纯脚本语言也可以做界面:我还真见过有人用 python 做 anki ,用 ahk 做查词软件的
    ,还有那个 aardio 不是热门过,也有些小工具,不过底层不开源
    , python ui 库也不少了
    ,硬核……
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1552 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:03 · PVG 01:03 · LAX 09:03 · JFK 12:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.