Windows native app development is a mess

(domenic.me)

177 points | by domenicd 8 hours ago

36 comments

  • pjmlp 44 minutes ago
    Again, unless you have existing Windows 8/10 applications that were written against WinRT, UAP or UWP[0], that make use of WinUI 2.0, forget about touching anything related to WinUI 3.0 or WinAppSDK, stay away from the marketing.

    Exception being the few APIs that have been introduced in Win32 that instead of COM, actually depend on WinRT like the new MIDI 2.0 or Windows ML.

    Keep using Win32, MFC (yes it is in a better state than WinUI 3.0 with C++), WinForms, WPF, if using Microsoft only tooling.

    Otherwise, Qt, VCL, Firemonkey, Avalonia, Uno, ImGUI,....

    They were even forced to revamp WPF status at BUILD 2024, given how bad WinUI 3.0 was back then, and it isn't if it got any better, apparently it is in the process of being open sourced, to see if the community can take over the mess a $4 trillion valued company cannot fix.

    Really, stay away from WinUI, unless you're a Microsoft employee on the Windows team without any other option.

    [0] - Can explain by the nth time the differences, if one feels like it.

    • layer8 3 minutes ago
      In that light, it is troubling that Friday’s blog post [0] announced “moving core Windows experiences to the WinUI3 framework” as a measure to improve the quality of said experiences.

      [0] https://blogs.windows.com/windows-insider/2026/03/20/our-com...

    • nozzlegear 11 minutes ago
      Just wanted to add a shoutout to WinJS for posterity, with which I built a Windows 8 app that I had published to the Windows Store for a brief period of time. Then they open-sourced the UI part of WinJS and decided it was just a web framework instead of an officially supported method for building Windows apps iirc, which was the end of my foray into the Windows store.

      https://github.com/winjs/winjs

      • Klonoar 7 minutes ago
        If you want JS, isn’t react-native-windows an option?
  • apankrat 1 hour ago
    Let me chime in and say that plain Win32 API is a perfectly viable option if you are using C++ (or another "OO" language) and if you are willing to sink a couple of weeks into writing your own MFC-like wrapper.

    Clearly this is not an option for those who are just starting up with Windows GUI work, but with little experience it is really a matter of 2-3 weeks of ground work and then you have full control over all nuances of the UI, yours to extend and mend as you wish.

    If there's one thing that Microsoft is really good at, it's ensuring deep backward compatibility. So anything that's based on Win32 API is going to be stable. If it works now, it will work later.

    I have some examples from 10+ years of development updates accumulated here - https://bvckup2.com/wip

    • domenicd 1 hour ago
      Judging from the screenshots, that doesn't produce Windows 11 style UIs, right? I.e. it contributes to the problem exploree at https://ntdotdev.wordpress.com/2023/01/01/state-of-the-windo...
      • layer8 1 minute ago
        Many would consider that a positive.
      • jwagenet 11 minutes ago
        Maybe I grew up with Windows so the older uis don’t phase me, but I find these sort of complaints rich considering differences between gtk, qt, etc in Linux userland. The average Windows user might stumble on an aero dialog, which is arguably less jarring in win11 than og metro.
      • apankrat 1 hour ago
        Screenshots are made on Windows 8.1 box, the windows chrome comes from there.

        Plus the whole thing is meant to work on ancient Windows versions (like, Vista and WS2008 ancient), so that ultimately defines the minimal common UI denominator.

    • nslsm 30 minutes ago
      I don’t want to be that person, but if you can think of a decent API for your MFC-style wrapper, an AI should be able to write a decent implementation for you.
      • AnotherGoodName 15 minutes ago
        Agreed. In fact this supports the GPs point about using the rawest form of GUI manipulation.

        For years we loaded up libraries and abstractions to minimize boilerplate. These hid the actual underlying mechanisms and often made specific customisations harder to do since you were taken away from the raw functionality.

        These days AI is extremely good at writing boilerplate and in my opinion explicitly typed out boilerplate code is much easier to reason about than a library that abstracts things away to a one line annotation or similar.

        A good example is that i've recently been leaning back to the raw Android apis for things like recyclerviews etc. It used to be 10+ files to changed to create an efficient scrolling view on Android with various resources and adapters required. So a whole bunch of libraries came out to try to abstract the complexity away. You know what though? I don't care about that anymore. I'm going back to the raw GUI APIs where possible because it's so explicit and clear even if it's 10x more code.

    • pkphilip 33 minutes ago
      Why not just use C++ Builder or Delphi?
  • cv5005 5 hours ago
    I'm an embedded programmer who occassionally needs to write various windows programs to interface with embedded devices (usually via serial port or usb), and I find it a breeze to write native gui programs in pure win32 and c++.

    Recently had to add a new feature to and old program that was last updated in the XP era and two things to note:

    1. The program did not need to be updated to run on Vista, 7, 10 and 11, shit just kept working throughout the years.

    2. I loaded the project into Visual Studio 2022, it converted from VC6 and compiled without problems, added the feature, shipped a new .exe to the customer, and it just worked.

    What other platform has that backwards and forwards compatibility success story?

    • user____name 5 hours ago
      I feel like I'm the only person in the world who would rather write ugly win32 jank for the rest of my days than ever having to touch an "elegant" or "well structured" Cocoa codebase. In win32 if you want a button you call a function and pass a hande, in the Apple world you first subclass 7 interfaces in some unreadable Smalltalk-wannabe syntax and pray you don't need to access the documentation. And of course they constantly change things because breaking backwards compatibility is Apple's kink.
      • dgxyz 4 hours ago
        After bouncing around GUI toolkits (from win32 to SwiftUI) and web for 30 years I have simply run out of fucks. They all suck. Each in their own unique way. Apple aren't worth singling out - they are just their own special isolated variant of it.
        • rwmj 2 hours ago
          Tcl/Tk is pretty good in terms of rapid development. Unfortunately it has stagnated quite a lot over the years.

          Gtk on the other hand is absolutely terrible and its developers don't help by completely rewriting things every few years and breaking all existing code in the process.

        • lylejantzi3rd 3 hours ago
          But, why? It's been 30 years. You'd think somebody would have figured out how to make a decent GUI toolkit or framework.
          • lenkite 1 hour ago
            They generally get the design right after some mistakes and are stabilizing it, when the new UI designers take over and want to re-do it from scratch.
          • dgxyz 3 hours ago
            We just built layers of shit over the ones we have.
      • dcrazy 1 hour ago
        This is patently false. To add a button to your UI, you open your window’s nib file Xcode/Interface Builder, click the plus button on the toolbar, and add a button. Then you control-drag from the button to File’s Owner and choose the method that you want to invoke when the button is clicked. Done.
      • cosmic_cheese 4 hours ago
        That feels like quite the exaggeration. If all you want is a button, all you need to do is initialize an NSButton and then tweak a few properties to customize it as desired.

        If you want something more custom, subclass NSControl and you’re off to the races.

        And if Obj-C isn’t your cup of tea, one can use Swift instead, even in a codebase that had been only Obj-C prior.

      • steve1977 3 hours ago
        Sorry, but this is simply just misinformation.

        If you were doing "classic" Cocoa in the way it was intended, you wouldn't need to subclass anything for a simple button.

        You wouldn't even need to write a single line of code, you'd just instantiate said button in Interface Builder, hook it up to a delegate (e.g. a window controller) and off you go. You can create a hello world example with a handful lines of code.

        And even if you'd rather create the button programmatically, it's not much more involved.

        Sure, if you're coming from Win32 and expect to program Cocoa without learning Cocoa, you're out of luck. But I guess that applies to all frameworks.

      • kageroumado 3 hours ago
        You can now use SwiftUI, which is, as of the latest version, quite stable. They used to change things a lot between releases a few years ago, but nowadays you don't need to refactor your code every year. Only issue with it is that it's iOS first, so you may need to fallback to AppKit (Cocoa) to implement more complex elements.
      • 762236 4 hours ago
        This is such a wonderfully beneficial comment to the HN community. It should get an award.
    • samiv 5 hours ago
      To me this kind of "no need to change anything" implies stability but there's a younger cohort of developers who are used to everything changing every week and who think that something that is older than week is "unmaintained" and thus buggy and broken.
      • raw_anon_1111 4 hours ago
        One of the earliest security issues that I remember hitting Windows was that if you had a server running IIS, anyone could easily put a properly encoded string in the browser and run any command by causing IIS to shell out to cmd.

        https://learn.microsoft.com/en-us/security-updates/securityb...

        I mentioned in another reply the 12 different ways that you had to define a string depending on which API you had to call.

        Can you imagine all of the vulnerabilities in Windows caused by the layers and layers of sediment built up over 30 years?

        It would be as if the modern ARM Macs had emulators for 68K, PPC, 32-bit x86 apps and 64K x86 apps (which they do) and had 64 bit Carbon libraries (just to keep Adobe happy)

      • sethhochberg 1 hour ago
        I think its at least as much of a working environment preference.

        Once I became experienced enough to have opinions about things like my editor and terminal emulator... suddenly the Visual Studio environment wasn't nearly as appealing. The Unix philosophy of things being just text than you can just edit in the editor you're already using made much more sense to me than digging through nested submenus to change configuration.

        I certainly respect the unmatched Win32 backwards/forwards compatibility story. But as a developer in my younger years, particularly pre-WSL, I could get more modern tools that were less coupled to my OS or language choice, more money, and company culture that was more relevant to my in my 20s jumping into Ruby/Rails development than the Windows development ecosystem despite the things it does really well.

        Or to say differently: it wasn't the stability of the API that made Windows development seem boring. It was the kind of companies that did it, the rest of the surrounding ecosystem of tools they did it with, and the way they paid for doing it. (But even when I was actually writing code full time some corners of the JS ecosystem seemed to lean too hard into the wild west mentality. Still do, I suspect, just now its Typescript in support of AI).

      • mcswell 4 hours ago
        Repeat after me: New! Fresh! Clean!
    • jordand 5 hours ago
      The one big challenge I've had with big legacy Win32/C++ codebases is migrating it fully from 32bit to 64bit. Loads of know-how and docs for complex GUI controls and structs are lost to time, or really fragmented. Other than that, yeah it really does all just work once you're past that.
      • criddell 1 hour ago
        I went through that a few years ago and it actually went pretty smoothly. There were a few UINT_PTR or DWORD_PTR changes I had to get used to and a couple of string glitches (we mostly used the _T() macro for strings and already used the _t variants of string functions in the original code, so that helped).

        The biggest problems were DAO (database) and a few COM controls that were not available in x64.

      • cv5005 5 hours ago
        Well it's still a 32 bit program so I guess that helps. Would probably require some porting to make it 64 bit native, but as long as you use the WPARAM, INT_PTR typed and what not correctly it 'should just work'.
        • jordand 4 hours ago
          Yeah that's the bulk of the work for migrating small Win32 apps. Things escalate when someone has built their own dynamic GUI framework over Win32, used a range of GUI controls, and then built event-driven apps on top of that, it's a lot lol
      • Dwedit 4 hours ago
        In 32-bit windows, you used to be able to see if a pointer was valid or not by seeing if it pointed to the last 2GB of address space. If it did, it was pointing to Kernel memory that was not valid for user mode code.

        But then Large Address Aware (4GB limit) changes everything, and you can't do that anymore. In order for a program to be Large Address Aware, you need to not try to do things like check high bits of pointers, then every single library and DLL you use also needs to do the same.

        • raw_anon_1111 4 hours ago
          That sounds like the same ugly hack that caused programs not to be “32 bit clean” back in the day for Macs
          • rwmj 2 hours ago
            Ah yes, these 68000 pointers have a spare 8 bits for me to use! Because nothing will ever need more than 16 MB of memory. Sigh.
      • mschuster91 5 hours ago
        Doesn't WINE have pretty decent documentation by now from all the reverse engineering?
        • jordand 4 hours ago
          Win32 programming has been reduced to a small niche now. Even 20+ year old Win32 books don't cover things in-depth (or practical use cases) let alone the 32bit->64bit migration
        • sourcegrift 5 hours ago
          Wine cannot even install office 2014. It's not really as food as some claim sadly.
          • anthk 4 hours ago
            Lutris can up to 2016.
    • dgxyz 4 hours ago
      Yeah that doesn't always work that well. Think you were lucky.

      Add high DPI to the mix and things get rough very quickly. Also the common control have weird input issues (try ctrl+backspace in an Edit control). All those little things need to be fixed carefully for something to be ok in 2026.

    • sys_64738 1 hour ago
      I've not done MFC Win32 programming since 1999 but if I recall those programs don't execute the main() function. They instantiate the Win32 class for your app or something like that. I can't remember any details anymore.
    • raw_anon_1111 4 hours ago
      And the 12 different ways to define a string depending on which API you call
    • moomin 2 hours ago
      But that’s the point the article’s making. At the C level you’ve got a fully functional system. Above that level (even at the C++ level), feature support is a mess.
    • finghin 1 hour ago
      ‘Madness is something rare in individuals — but in groups, parties, peoples, and ages, it is the rule’ —F. Nietzsche

      (tongue in cheek)

    • LAC-Tech 5 hours ago
      Winforms?

      lol at them still bekng the best option. so much wasted effort trying to replace them

      • pjc50 5 hours ago
        Winforms is great until you try to make windows dynamically sized, or deal with DPI nicely. In every other regard it's still fine, and for accessibility actually _better_ than many subsequent frameworks. And produces nice small fast executables.
        • HauntingPin 5 hours ago
          I assume that if Microsoft hadn't abandoned WinForms for the next thing, it would support dynamic sizing and DPI properly. It's mindboggling how much time and effort they've wasted coming up with new GUI frameworks instead of just improving on what they have.
        • pjmlp 42 minutes ago
          Windows dynamically sized is quite easy, people have had enough time to learn how to use layout managers in Windows Forms.

          Naturally it is a bit more than just drag and drop controls from the toolbox.

          HiDPI is supported in modern .NET, with additionally APIs, that aren't enabled by default only due to backwards compatibility.

        • runjake 1 hour ago
          It's been a while since I've touched it, but IIRC they made WinForms play with Hi-DPI nicely.
    • lucianbr 5 hours ago
      How does it look? I mean, what do the widgets look like?
      • cv5005 5 hours ago
        This was an MFC project, so your old standard win32 common controls that looks the same since 98 or so.
    • tibbydudeza 1 hour ago
      Same here - our IOT device is a i5 running Windows IOT. Recently I switched from C++/Win32 to Golang and walk.
    • tsss 4 hours ago
      Honestly, your GUIs are too simple to be part of this conversation. Try writing something like Spotify in WinAPI and that's not even a complicated GUI either.
      • QuadmasterXLII 1 hour ago
        Spotify would be remarkably improved if it became a simple enough gui to be excluded from this conversation.
      • troupo 3 hours ago
        Most apps at the time managed that quite successfully. IIRC Adobe Photoshop was an MFC app. There was no other API but Win32 API.
  • iamcalledrob 1 hour ago
    The author is right, it's really such a mess.

    The lessons I've learnt building and shipping a few a Windows apps at scale are basically:

    (1) Learn Win32 and use those ancient APIs if possible, they're extraordinarily stable and you'll probably need to reach for them anyway. They're not that scary.

    (2) Don't use any Microsoft-owned UI toolkit, you'll get burnt. Literally anything is better. Ideally choose a toolkit that doesn't prevent layering in Win32 tweaks on top, otherwise you'll end up hitting cases the toolkit developers didn't think of and you can't fix. You're going to need a custom WindowProc eventually. You need to have access to the underlying Win32 window lifecycle and handles.

    • somenameforme 1 hour ago
      > "(2) Don't use any Microsoft-owned UI toolkit, you'll get burnt"

      This is 100% true for all of their techs produced within the past ~20 years, but WPF and Winforms are extremely stable with no real issues.

      It's so weird too because most of everything they've done in the past 20 years has basically just been incomplete remixes of WPF. If they just stuck with WPF and extended it onward, something like a UI toolkit equivalent of C#, it would 100% be the gold standard for Windows development today, and perhaps even UI development in general if they open source/standarded it.

  • drnick1 52 minutes ago
    > But, in 2026, writing a greenfield application in a memory-unsafe language like C++ is a crime.

    I disagree, the GUI layer is far from behind a safety critical component, and C++ is a battle-tested choice for everything from GUI, videos games, to industrial applications. If C++ is safe enough to control airplanes and nuclear reactors when used well, it is certainly safe enough for something as trivial a GUI.

    The article also fails to mention frameworks like Qt, arguably the best way to write GUI apps in 2026. Qt is native (C++), has built-in memory safety features (but no GC), and is cross-platform.

    • glitchc 48 minutes ago
      Yet we cannot consider Qt to be native app development since every app requires the Qt runtime. Native means system libraries only.
      • 201984 18 minutes ago
        >Native means system libraries only.

        Since when? To me, anything not webview-based is native, though you have varying degrees of integration into the platform.

        • Rohansi 12 minutes ago
          Why single out WebViews? Would you consider Flutter native? It renders widgets on its own just like a WebView does.
    • vovavili 42 minutes ago
      Why would the article mention Qt? Qt is native for a subset of Linux distributions, not Windows.
    • KellyCriterion 50 minutes ago
      ...but it is comfortable and actually a PITA compared to any managed execution environment :-)

      Sure, embedded systems are a different anmial...

  • wolvoleo 5 hours ago
    > And from what I can tell, neither are most developers. The Hacker News commentariat loves to bemoan the death of native apps. But given what a mess the Windows app platform is, I’ll pick the web stack any day, with Electron or Tauri to bridge down to the relevant Win32 APIs for OS integration.

    Well yes as a user I prefer native apps for their performance. It's clearly a mess to develop native apps as the article shows. But as a user I don't see that problem. I do see ever worsening apps though. Like the total mess that is new outlook and teams.

    • hu3 1 hour ago
      Speaking about Electron, for my own little tools I have been using TypeScript+Bun with Electrobun.

      https://github.com/blackboardsh/electrobun

      • runjake 1 hour ago
        This is neat! I clicked through about 10 app examples on that page and none of them had a screenshot of the app!

        It's a grave sin to have an app repo without a screenshot in the main README.md.

    • aaomidi 4 hours ago
      When Microsoft themselves use electron to develop apps what expectations can we have on other devs?
      • wolvoleo 24 minutes ago
        Microsoft has always stood for mediocre quality software so that's no surprise.

        Also, they stopped caring about Windows because they want recurring service revenue. Making Windows a subscription service for consumers would outrage the users (even though they kinda already do this for business with Microsoft 365). So the consumer market is just viewed as a billboard for M365 and Copilot. So everything you see there is just lowball effort, even worse than their normal quality.

      • Sindisil 4 hours ago
        To do better?

        It's demonstrably possible. And further, why does what some portion of Microsoft, a huge, multi-headed beast, does qualify as the bar for what is reasonable for users to expect?

        • ethin 1 hour ago
          This, and add to that the fact that web apps make it trivial for the dev to just randomly change the GUI out from under me without my consent or ability to prevent it, and, well, wonder why I and so many others dislike them? I want to be able to refuse app updates, thank you very much.
        • lenkite 1 hour ago
          A question - Which portion of Microsoft, the multi-headed beast develops pure-native apps now ? Even the Windows 11 Settings app is Javascript.

          The multi-headed beast has been assimilated by web-tech. They can't code GUI C++ no more - except their compiler/graphics team. And even the latter are dying.

        • aaomidi 2 hours ago
          As a user Microsoft is windows and windows is Microsoft.

          If doing native apps was realistic then I’d expect windows, Microsoft, etc to also do them.

      • DANmode 40 minutes ago
        To decide what tools are the right job for each project,

        same expectation as always.

        So many “let’s race-to-the-bottom along with the authority” comments on HN lately.

        Dude: no! =]

  • jasonjei 1 hour ago
    It’s been a long time since I had to touch Windows development. If I had to do it over again, I would use React Native for Windows UI where possible and low-level Win32-React Native module bridges for user space code.

    The last time I had to do Windows development was about 15 years ago. I used a library called WTL (I think a couple comments here mention it). I couldn’t use any of the newer stuff that Windows 8-10 were pushing because it needed backward compatibility. It seemed way less bloated than MFC, but not as annoying to use as ATL or rawdogging Win32 APIs.

    Ironically, I was developing a Win32 app to build a cloud bridge to a Rails app (talking to Quickbooks COM API which was hell on Earth, with XML and XML definitions) on Mac, using VMware on Mac to talk to Quickbooks Windows. I was so annoyed with Win32 development I used the Chrome Embedded Framework library to build the UI for the Win32 app so I wouldn’t have to wrestle WTL for UI and just have browser-based views to drive UI.

    I think it was very tempting to drop C/C++ development for .NET code, but I didn’t want to drop off user adoption by requesting users to download a huge .NET runtime if their computer didn’t already have it.

    This was when I was building Levion, a Quickbooks Windows to Cloud Rails app…

  • sylens 5 hours ago
    Author raises several good points. Why isn't the latest .NET runtime pulled down into Windows 11 devices via Windows Update? Why isn't there a better path forward for deployment?

    It's another example of how they have completely abandoned any attempt at providing a good user experience across their products

    • jayd16 3 hours ago
      Windows update is how it used to work and it's terrible. An update breaks old apps, or downloads a every single version (not feasible). Who would want to run windows update to install a new app?

      It's just a bad idea. Today we just pack in the DLLs and it just works.

    • c-linkage 4 hours ago
      There are a few reasons that I can see why they don't integrate the latest .net.

      First is that the security model changed with .net 5. Next is that they subsume Mono/.net core into the foundation of the language and this cost them them the ability to support Windows native development, specifically anything to do with Win32 API.

      If you look at .net 10 and compare that to .net 5 you can see that they are trying to reintegrate the Win32 API but now it is in the all new Microsoft namespace.

      The amount of change is too significant to act as a drop in replacement for the original .net framework. Maybe they could have gone a side-by-side installation, but the rapid development of The NET Framework I think made it too hard to tie to an operating system update. They wanted to free it from that update cycle of once a year or every two years and allow the development to progress rapidly at the cost of having to download it and install it each time.

      • domenicd 4 hours ago
        Side by side is what I'm asking for. Just like there's WebView (IE-based) and WebView2 (Chromium-based, evergreen, updated every 4 weeks).

        I don't think the rapid development cycle argument holds water, when they're shipping a new WebView2 every month.

    • moomin 2 hours ago
      There’s two versions of .NET. One is “legacy”, which is stable as anything and bundled with the OS. The other is “Core”, that only has support for three years and isn’t 100% compatible. The reason the latest .NET runtime isn’t bundled is the above: the stable version is bundled.
      • Atotalnoob 1 hour ago
        Core is compatible with non deprecated apis.

        That’s why they had .NET 5im stead of .net core 5

  • Kwpolska 27 minutes ago
    > However, for no reason I can understand, Microsoft has decided that even the latest versions of Windows 11 only get .NET 4.8.1 preinstalled.

    .NET has new releases every year, supported for 2 or 3 years. That’s not really compatible with Windows release cycles. Also, if Windows 11 25H2 shipped .NET 8, and now Windows 11 26H2 would ship .NET 10, apps which depend on version 8 might break. Easier to just think of .NET as a runtime like Java or Python.

    ---

    Regarding tray icons, 1Password, Signal, and Discord are all Electron apps, so they are using Chrome’s UI toolkit, and its menu component.

    Myself, I’m happy with WPF. Starting with .NET 9, it comes with a really good WinUI-style theme.

  • xg15 34 minutes ago
    > One might think that an advantage of controlling C# would be that Microsoft has carefully shaped and coevolved it to be the perfect programming language for Windows APIs. This does not appear to be the case.

    I think they spent all their mana for that on pre-.NET Visual Basic and then had nothing left.

  • fermentation 46 minutes ago
    The Windows code signing experience has prevented me from shipping apps that otherwise run perfectly fine on the platform. It is a nightmare and I cannot believe it wasn't called out in the "We want to fix Windows" blog post.

    Just do exactly what Apple does. Charge me $100 directly from you and let me build an .exe that I can distribute on my website.

    • vegasje 19 minutes ago
      This isn't well-known, so I figured I'd mention it.

      Microsoft offers a service called Azure Artifact Signing (used to be called Trusted Signing) that manages code signing for you:

      https://azure.microsoft.com/en-us/pricing/details/artifact-s...

      It's $9.99/mo, and you don't need to worry about procuring or renewing code signing certs.

  • rwmj 4 hours ago
    This is quite timely as we need to write a simple UI for Windows (a few buttons, status, maybe a file menu). The main constraint is it must compile to a single binary (.exe) with no dependencies such as runtimes, DLLs, languages etc. It also needs to run on some older unsupported Windows systems, probably Windows >= 7, 32 bit.

    My first thought was MFC. Basic, fast, well understood.

    But then maybe WxWindows so we can cross-compile it (from Linux) and use the same UI on other platforms? It could probably be compiled statically although I've not tested it.

    Or Mono, but that needs a runtime?

    Edit: Some comments mention Qt which could also work although how large is the runtime? Can it be compiled statically?

    • Conan_Kudo 3 hours ago
      > Edit: Some comments mention Qt which could also work although how large is the runtime? Can it be compiled statically?

      You need a commercial license for that, but yes you could. But since applications are typically distributed with install bundles that put into application-local program files directories, it's not super-important as long as you only cherry-pick the Qt libraries you need.

    • Atotalnoob 1 hour ago
      .net will work. Use a weaver (fody) or the modern features to roll everything into 1 .exe.

      Use self-contained to have everything together.

      https://learn.microsoft.com/en-us/dotnet/core/deploying/sing...

    • kwanbix 4 hours ago
      Delphi or Lazarus (https://www.lazarus-ide.org) should solve it.
      • rwmj 4 hours ago
        Nice, I didn't know there was a free software version of Delphi nowadays.
  • jbm 1 hour ago
    > 9 MiB

    I'm glad people still care about stuff like this. It drives me insane that the simplest form-based software that I build and compile ends up being 50-100 MiB; several times video games from the 80s that I grew up with that did much more complex work, graphically and computationally, on a tenth of the space.

  • TheJoeMan 38 minutes ago
    I’m still confused which frameworks are tied to which “visuals”. Ignoring the web-frameworks, do Win32 apps inherently look like Windows XP buttons or can they look more modern?

    It might be nice if the article could add screenshots, a few of the Wikipedia links have a screenshot, but again I’m not sure if you’re limited to that UI or not.

    I also like the carousel in the article showing the tray menus, but again not sure what they are each “built-with”.

  • mellosouls 3 hours ago
    Really nice article, thanks - yes I found the same myself recently when trying to write a trivial (I thought) Windows app.

    I first investigated the Windows native options and was pretty bamboozled; I wanted to use the "mainstream" "up to date" option (presumably c# and some framework) but as TFA describes, it wasn't at all clear which that was.

    I ended up doing it in python with pyqt then finding out a clean deployment was a pain, so revisited the .Net options and remembered why I'd discarded them in the first place...

    It is indeed a complete mess (at least coming in anew) and a very strange situation for the world's main desktop environment to be in.

  • ashwinnair99 5 hours ago
    It has been a mess for 15 years and Microsoft keeps making it worse by adding new frameworks without retiring the old ones. Win32, WPF, WinUI, MAUI. Nobody knows which one to pick.
    • Smalltalker-80 5 hours ago
      Yes, and the hubris sting-of-death was UWP. They tried to make Windows into a mobile OS, severely restricting the alowed actions of programs, including strict certification to be able to run them (elsewhere). Of course nobody went for this and UWP died a quiet death. Recently there are signs that MS is trying to go back to making products that users actualle want (Win11 reverts). We'll see...
      • anonymars 39 minutes ago
        > They tried to make Windows into a mobile OS, severely restricting the alowed actions of program

        They already had Silverlight! For Windows Phone 7. Then they killed that off too and expected the "plethora" of WP7 apps to be rebuilt for WP8 (requiring the beloved Windows 8 desktop OS for this task). Then they again expected developers to throw that away in favor of UWP for Windows 10, which unified the desktop and phone OSes. By then it was too late.

        Old apps still ran on the newer OSes but the SDKs became dead-ends.

      • pdpi 5 hours ago
        > (Win11 reverts).

        I must've missed that one. What did they revert?

    • hrmtst93837 1 hour ago
      Picking a stack for native Windows UI is like rolling dice, except sometimes you get bitten by COM for fun. If you care at all about backwards compatibility or deploying outside the MS Store you basically end up circling back to Win32 APIs much as the frameworks would love for you to pretend otherwise. Ironically, the 'official' docs now reads like a half-hearted apology for the last decade of churn.
    • mschuster91 5 hours ago
      > without retiring the old ones

      They'd lose too much enterprise software that's not being maintained any longer but still is business critical.

      You can still run most programs from the Windows 95 era unmodified on a modern Windows 11 machine and a lot of things is relying on that under the hood.

  • intrasight 5 hours ago
    "So when I went to work on my app, I was astonished to find that twenty years after the release of WPF, the boilerplate had barely changed."

    Such is the benefit and the curse, I guess, of having the Windows API being locked in the distant past for backwards compatibility.

    I've always been surprised that Microsoft didn't do a full operating system refactor and provide a compatibility layer for running old binaries. Perhaps they figure it would be better to just transition everything to software as a service using web tech? But I just don't see how that strategy is gonna work long-term.

    • mwkaufma 1 hour ago
      They DID such a refactor for Win NT under David Cutler. Even in that comparatively simpler time it was a huge undertaking, and required all-hands-on-deck management that doesn't exist anywhere in tech anymore, let alone at today's Microsoft.
    • fsloth 5 hours ago
      "I've always been surprised that Microsoft didn't do a full operating system refactor and provide a compatibility layer for running old binaries"

      Just keeping a legacy system in working order is different skillset than writing a new system from scratch.

      So you need a new team. Nothing from Windows maintenance transfers.

      Maybe would require hiring someone who knows how to design an OS.

      It would be a major undertaking, needing protection by CEO (and if it would not succeed CEO would loose a lot of prestige).

      I'm not saying MS does not have the existing talent base. I don't _know_.

      But I've been inside a house maintaining a monstrous legacy codebase.

      I can tell you - it requires surprisingly little deep understanding just to keep an existing system going.

  • kantselovich 48 minutes ago
    Thank you for the detailed write up.

    I’m was thinking about building native windows UI, wrapping around cross platform library written in swift. I did not know it was that messy and complicated.

  • lpcvoid 5 hours ago
    Lazarus is crazy good, as is Delphi, if you can afford it. wxWidgets is also nice, without the licensing weirdness that is Qt.
    • steve_taylor 4 hours ago
      Lazarus is probably the easiest way to make a lean and fast native Windows app without paying for tooling.
    • throwaway2046 1 hour ago
      wxWidgets is just a wrapper around existing UI libraries; win32 on Windows, and Gtk/Qt on *nix.
  • ozim 5 hours ago
    That is why everyone even Microsoft themselves does Electron.

    Running with html/css/js has benefits it really is open and free development based on international standards and not locked into any single big tech.

    • Boxxed 5 hours ago
      I don't know, I think it's pretty embarrassing that Teams is an electron (or whatever) app. The plot on native has been lost so badly that even the fucking company that makes the OS doesn't want to deal with it.
    • IlikeMadison 4 hours ago
      Electron is the worst thing that happened to quality software. I spoke to two HR guys last year at the company I'm working at and they told me they ditch every single resume mentioning "web technologies" in them. Funny part is when they also told me these "bad" resumes are for the vast majority H1B wannabees.
      • ToucanLoucan 13 minutes ago
        Second. I wouldn't say we ditch resumes on that basis, but ultimately, we're a native outfit only. You can be the best damn app developer on Earth but if all you've ever used is Electron, well, I can't use you.
      • debugnik 2 hours ago
        What's so funny about that? Most electron turds I deal with are American in the first place, they must be trying to appeal to you.
    • pier25 5 hours ago
      Isn’t Microsoft also using React native for desktop stuff?
    • anthk 4 hours ago
      NPM it's the bigger turd happened ever, slow and bloated. And JS today amounts the biggest enforced propietary loading method of existence in almost every web page.

      Open? You wish.

      >and not locked into any single big tech.

      DRM and propietary cody tells me otherwise.

    • ToucanLoucan 5 hours ago
      Clown shit. “We’re made our own OS a nightmare to build on so we’re gonna use JavaScript powered pseudo-VMs and make everything take 2 gigs of ram minimum”
  • samiv 5 hours ago
    Seems to me that really the simplest solution to authors problem is to write C++ safely. I mean...this is a trivial utility app. If you can't get that right in modern C++ you should probably just not even pretend to be a C++ programmer.
    • flufluflufluffy 29 minutes ago
      Yeah he literally answered his own question and then used a random excuse for not going with the option.
    • rwmj 4 hours ago
      Just write C++ safely! Why didn't we think of that?
  • MomsAVoxell 1 hour ago
    I just use JUCE. It solves all the problems I need solved on Windows and doesn’t lock me into anything. More and more, if its not cross platform C++, it just doesn’t make any sense to invest in it. This is getting more relevant as the years go by, alas.
  • PaulKeeble 4 hours ago
    Most of the desktop applications I have wrote over the years have been in other languages like Java and Go as I have wanted them to mostly be cross platform. In these cases I have always used the Software UI, which in Java is Swing and in Go is Fyne. These are usually reasonably fast, don't necessarily look native depending on how its themed but ultimately fit the language better than trying to bridge to Win32 or GTK/QT.
  • AyanamiKaine 1 hour ago
    Because I didnt see it already mentioned. Avalonia[1] and Uno[2] for C# are also really great if you want to write windows apps. I wrote some in Avalonia that worked incredible nice on Linux and Windows.

    You dont have to use MVVM or AXML for example Uno allows for C# Markup[3] to be used instead or MVUX instead of MVVM.

    I personally hate MVVM and AXML but you are not forced to use them.

    For Avalonia I dabbled in creating my own replacement[4] for MVVM and AXML using Flecs.Net.

    In Avalonia I created a tray icon for the trash bin. So I can see how big it is and clear/open it with a small menu[5].

    Both Avalonia and Uno should at least be looked at when judging which framework to use. They are both quite mature and have many great controls and features built in.

    [1] https://avaloniaui.net/ [2] https://platform.uno/ [3] https://platform.uno/docs/articles/external/uno.extensions/d... [4] https://github.com/AyanamiKaine/Ayanami-sTower/blob/main/Ava... [5] https://github.com/AyanamiKaine/Ayanami-sTower/blob/main/App...

    • chiengineer 45 minutes ago
      I built multiple Avalonia apps with zero previous experience

      - Windows 11 Hardening utility - made it because all existing ones are not updated to handle all the new AI telemetry + new updates + I made it differently and more powerful than anything that exists currently

      - Windows Admin/ Security / Networking Utility built for my needs

      - Windows 11 Anti Virus Nuker - Completely shuts off windows defender without disrupting system performance or zombie files

      - and more

  • delduca 5 hours ago
    Best framework for this is Qt.
    • hliyan 4 hours ago
      I've recently discovered FLTK: https://www.fltk.org/doc-1.4/intro.html

      Haven't used Qt in a while, but at first glance, seems simpler: https://github.com/fltk/fltk/blob/master/examples/menubar-ad...

      • lazypenguin 1 hour ago
        FLTK is great at being fast and light, that’s about it. It’s kind of cumbersome to use but honestly does what it says on the tin. Highly recommend for smaller use cases but can’t imagine using on a large project. I used the rust bindings which are well maintained.
    • jordand 5 hours ago
      Yeah for my work, legacy Win32/WinForms/WPF codebases tools are kept maintained as-is, but new tools are usually written in PySide6 (QtWidgets or QtQuick) and it's worked out really well (other than bundling/distribution being tricky for big apps)
    • anthk 4 hours ago
      And Lazarus/FPC.
    • madduci 5 hours ago
      MFC is rock solid too
      • adzm 4 hours ago
        WTL and ATL also, especially if you need to do com stuff
        • pjmlp 35 minutes ago
          You will need it, because since Windows Vista, most new APIs are COM based, as they redid Longhorn ideas in C++ instead of .NET, and WinRT also builds upon it.

          Classical Win32 C API surface, with some exceptions, is mostly stuck in Windows XP view of the world.

  • p0w3n3d 3 hours ago
    It's always about the abstractions which try to cover the underlying mechanisms but not always can do it. The same with any programming, like named pipes for example. However I need to tell you that

    1. Wow you have great knowledge of windows. Congratulations

    2. Boy windows API is a mess.

  • LocalH 4 hours ago
    WinForms forever :evil:
  • ilovecake1984 1 hour ago
    There seems a lot of conflation between GUI frameworks and interacting with the OS in this article.
  • bentt 5 hours ago
    I wonder if Unity (the game engine) actually has a sneaky potential here. It’s cross platform, fast, and maybe just maybe less bloated than carrying around an entire browser like Electron?
    • Vedor 5 hours ago
      Not sure about Unity, bot Godot is already used to build tools, like Pixelorama (pixel art graphics editor, a bit akin to Asesprite), RPG In A Box (game engine targeted for RPG games), Bitmapflow (tool to generate in-between animation frames), and probably more I don't know about.

      Well, if I remember correctly, the Godot editor is written in Godot.

    • criddell 1 hour ago
      What's the accessibility story like? Do Unity applications work well with screen readers?
    • v9v 5 hours ago
      I think Godot is a possible contender as well. There are a few non-game applications made with it, and they've recently added a docs page tailored to non-game application development: https://docs.godotengine.org/en/stable/tutorials/ui/creating...
    • fsloth 5 hours ago
      Sure but different target market.

      CRUD apps are non-trivial.

      If Unity were to ship platform native replacement for WPF equivalent (hell or even winforms) it would become a really enticing app development platform.

      • flohofwoe 4 hours ago
        > CRUD apps are non-trivial.

        Aren't these pretty much the most trivial UI apps possible? E.g. compared to other native apps like Photoshop, Blender, Visual Studio or Office, CRUD is mostly just about banging together custom UI frontend for a database.

        Unity's editor is implemented in its own (old) UI system, same with Godot, so in both engines it's possible to create 'traditional' non-game UI applications.

    • pier25 5 hours ago
      Flutter is probably better suited for apps
    • irishcoffee 5 hours ago
      Just use Qt. Native, cross-platform, works like a champ.
    • jordand 5 hours ago
      Unity has a big runtime that needs to be bundled with it to run
    • moron4hire 5 hours ago
      Unity's 2D UI stuff is very poorly designed, with lots of edge cases where auto-calculated fields can hit a divide-by-zero issue and then become unrecoverable because the value is now NaN which can't be auto-calculated back to a number.
    • netbioserror 5 hours ago
      Speaking from personal experience, Godot has the sneakiest potential. It has all the UI components and flexible layout containers you could ask for, a signaling system that lets you put the methods from less relevant components in the scripts for more relevant ones (making for a more compact project), and you can also manually compile slim template builds for cleaner distribution. There's a future there.
  • GeoAtreides 4 hours ago
    come back home Delphi 7, all is forgiven
    • dardeaup 2 hours ago
      It seems that peak native Windows dev tools were Delphi 7 and VB6. It's a tragedy that something at least as good as VB6 is not still developed and supported by Microsoft.
      • rcleveng 1 hour ago
        There's nothing as good as VB6 that's developed and supported by *anyone*. It's not a Microsoft only phenomena.

        I think programmers started wanting "real" languages (notice the quotes), and henceforth got more complexity and things take longer, although with GenAI, we may be back to the "draw as screen and do this" that we were with VB6. Just now the source generated should be considered the object code, and the prompt is the new source (at least for those types of apps)

  • anthk 5 hours ago
    Given the size of some Electron software, bundling TCL/Tk with IronTCL and TCLLib+TKLib weights 58MB and you can develop your own software with it, and that with the source of everything included.

    And if you set a native theme for TTK in your code (literal two lines), your software will stop looking Motif-Industrial, the widgets will have the classic Win32 themes. It will look native from XP and up.

  • ocdtrekkie 4 hours ago
    I write .NET Framework 4.8 apps. And I will until .NET has an actual support lifetime. 4.8 will still be supported and receiving security updates in ten years, .NET 10 will be gone in 2.

    Hobby projects should not be built on a platform that is constantly changing underneath.

    • Marsymars 1 hour ago
      My company is moving our main LOB app to .NET 10 in the near future. It's taken a while but has gotten to the point where .NET 10 has pretty much caught up to .NET Framework for feature support, and our take is that the cross-platform support, performance gains and newer C# versions are worth more than the stability of .NET Framework.

      And the gap's going to keep growing - doing the upgrade now means future upgrades can be more frequent and incremental, rather than trying to move 4.8 to .NET 20 in a decade.

      • pjmlp 29 minutes ago
        Unfortunely I have reduced my use of .NET, because some of the partner products that we use, or customers that were into .NET, took the opportunity for going into another technology stack.

        Basically the kind of customers that were affected by the breaking changes, between Framework and Core, decided to keep the old stuff running in Framework, and consider other alternatives going forward.

        Not sure how much these kind of customers matter to the .NET team's upper management in customer acquisition, but they surely lost a few along the way.

        And now there is even CoPilot based migration tooling on VS 2026, because most likely there aren't that few that are still chugging along with Framework.

      • ocdtrekkie 19 minutes ago
        If .NET had a desktop UI for Linux it might be worth it for me, but we haven't gotten there yet somehow.
        • Marsymars 4 minutes ago
          Yeah we don't have any plans on moving our WPF app to Linux, but the rest of our stack (job scheduler, ASP.NET service, web APIs, etc.) all has real potential to get off of Windows.
  • whobre 5 hours ago
    Interestingly, no mention of WTL
    • domenicd 4 hours ago
      Ahah, I knew I missed one!

      I originally had ATL in there, but my proofreading squad (Claude and ChatGPT) told me that ATL was a more niche thing for COM, and looking at the Wikipedia article I was convinced they were right.

      But WTL was what I was thinking of---the step between the MFC and .NET that I forgot.

      • odkeidjwidj 2 hours ago
        > but my proofreading squad (Claude and ChatGPT) told me

        With all due respect (seriously): fuck off man

        This is why you don’t use these stupid fucking tools for this

  • livinglist 5 hours ago
    Still remember the days of writing apps for windows phone using c# and XAML. Good old times but no definitely don’t wanna go back.
  • on_the_train 3 hours ago
    All my work experience with guis was mfc. And all modernizations were web based. The in betweens are usually not considered worthwhile.

    But imgui is a breeze of fresh air for internal stuff

  • stefantalpalaru 1 hour ago
    [dead]