Top
Best
New

Posted by domenicd 9 hours ago

Windows native app development is a mess(domenic.me)
211 points | 218 comments
pjmlp 1 hour 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 1 hour 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...

fodkodrasz 4 minutes ago|||
These steps are necessary stepping stones in getting the thing good, the question is, given Microsoft's tendency to abandon UI frameworks halfway, apart from the classical ones listed above, is if they will keep it focused until its gets as mature as those.
pjmlp 1 hour ago||||
As long as it only applies to Microsoft employees, maybe the pain using C++/WinRT will finally improve the Visual Studio tooling for the rest of us, but I doubt it.

Thus better leave WinUI to the Windows team.

NetMageSCW 59 minutes ago|||
The only good thing to say about that is it removes the stupidity of using Electron (or the Microsoft Edge equivalent) for built-in Windows apps and the Start Menu. SMH.
bigfatkitten 25 minutes ago||
Whoever was responsible for that should be fired.
nozzlegear 1 hour 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

pjmlp 1 hour ago|||
I have a WinJS book somewhere, from Microsoft Press.

When it was announced at PDC, they only talked about WinJS and nothing else, the folks of .NET Rocks have a few shows where they mention they thought .NET was done, and they needed to refocus into something else.

The show where they interview Miguel de Icaza they go into this.

Klonoar 1 hour ago|||
If you want JS, isn’t react-native-windows an option?
nozzlegear 40 minutes ago||
It probably is now, but I don't think it was at the time. This was back in the early Windows 8 era, when apps were called "Metro" – 2012 to 2015 I think? I'm primarily a .NET dev by trade, but I wanted to try something different with WinJS so invested time in learning that.
apankrat 2 hours 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

ack_complete 48 minutes ago||
The main thing that's hard going down this route is dark mode support. The Win32 USER and common controls just don't not support dark mode, but are actively hostile to it due to the amount of hardcoded light colors and backgrounds in the system. All of the system colors are light regardless of the dark/light system setting, highlights are hardcoded to light blue, disabled controls use a hardcoded color, half of the window messages for changing control colors are silently ignored with theming is enabled. Menus are among the more difficult to deal with as they require extensive owner draw.

On top of this, there are a small handful of system UIs that do support dark mode and make your program look inconsistent with dark mode regardless. Message boxes will switch to dark mode, and so will file dialogs -- which is a problem if you've used the Vista-style customization, as any syslinks will appear in a color of blue that's hard to read against the dark mode background.

gzread 20 minutes ago||
First, dark mode is for people who set their screen brightness too high.

Second, win32 is designed with the ability to change all the default colors and you used to be able to do this by right clicking the desktop and selecting "properties". If dark mode doesn't follow this - just another symptom of Microsoft's siloing incompetence. The team that wrote dark mode may not have been aware that this feature existed because parts of the platform are so disconnected from other parts.

ack_complete 5 minutes ago||
Dark mode for apps is a setting in the OS and a general expectation now, it's suboptimal to ship a new UI that doesn't support it. And, again, Win32 message boxes in your program will switch to dark mode whether you want them to or not.

Win32 controls ignoring system colors goes much farther back than dark mode being introduced in Windows 10. The theming engine that broke a lot of that functionality was introduced in Windows XP. Beyond that, there were always a few hardcoded colors like disabled gray text going back to Windows 95.

Dark mode ignoring Win32 system colors is not incompetence. It was _intentional_. Dark mode was introduced by the UWP side, which intentionally did not extend it to Win32. To this day, there is not even a Win32 API for desktop apps to query whether dark mode is even enabled. The official recommendation is to compute the luminance of the UWP foreground color setting:

https://learn.microsoft.com/en-us/windows/apps/desktop/moder...

domenicd 2 hours 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...
apankrat 2 hours 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.

jwagenet 1 hour 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.
layer8 1 hour ago||||
Many would consider that a positive.
airstrike 1 hour ago|||
Jesus, that's way worse than I expected before clicking
nslsm 1 hour 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 1 hour 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 1 hour ago|||
Why not just use C++ Builder or Delphi?
gzread 19 minutes ago||
Presumably because they don't support C++23
shmerl 28 minutes ago||
> If it works now, it will work later.

Wine is better at it than Windows itself. Especially for really old programs.

cv5005 6 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 6 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 5 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 3 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.

bigfatkitten 20 minutes ago||
Tcl/Tk was also popular in certain niche products, like in RF test equipment.
lylejantzi3rd 5 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.
NetMageSCW 57 minutes ago|||
Have you tried WinForms? It isn’t the latest hotness so Microsoft has to be dragged kicking and screaming to support it in current VS, but they were forced to do so because corporate developers still have some clout.
lenkite 2 hours 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 4 hours ago|||
We just built layers of shit over the ones we have.
dcrazy 3 hours 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.
steve1977 1 hour ago|||
And this already worked in OPENSTEP, like 30 years ago.
paulddraper 25 minutes ago|||
Programming with GUIs?
dcrazy 15 minutes ago|||
Yes, generations of Mac and Windows programmers have used GUIs to create their GUIs. Visual Basic, MFC + App Studio, .NET + WinForms, Interface Builder…
gzread 17 minutes ago|||
Why wouldn't you program a GUI with a GUI if one is available? Avoiding the use of WYSIWYG editors when making GUIs is like avoiding the use of musical instruments when writing songs.
cosmic_cheese 6 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.

markus_zhang 51 minutes ago||||
I'm probably another, but I have never done any professional Win32 work. You know, those kind of jobs are rare now and I doubt they want anyone without experience.
mayoff 33 minutes ago||||
How to add a button in SwiftUI:

    Button(“Click Me”) { buttonWasClicked() }
steve1977 5 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 4 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 5 hours ago|||
This is such a wonderfully beneficial comment to the HN community. It should get an award.
samiv 6 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 5 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 2 hours 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 5 hours ago|||
Repeat after me: New! Fresh! Clean!
jordand 6 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 2 hours 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.

NetMageSCW 54 minutes ago||
Having to use macros for literal strings in your code is just incredibly stupid of Microsoft and/or C++.
gzread 14 minutes ago||
How do Linux and Java do it, when you want to compile your program in both 16-bit char and 8-bit char mode? Oh that's right, you don't.

You can pick one or the otherfor Windows too, so don't ask me why it's done that way. It was originally so you could compile for both the new hotness Unicode, and the old compatible ASCII.

cv5005 6 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 6 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 5 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 5 hours ago||
That sounds like the same ugly hack that caused programs not to be “32 bit clean” back in the day for Macs
ack_complete 38 minutes ago|||
One difference is that the Mac OS itself was not initially 32-bit clean, with the top byte being used by the Memory Manager.
rwmj 3 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.
dcrazy 31 minutes ago||
This is how pointer authentication codes work on Arm64.
mschuster91 6 hours ago|||
Doesn't WINE have pretty decent documentation by now from all the reverse engineering?
jordand 6 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 6 hours ago|||
Wine cannot even install office 2014. It's not really as food as some claim sadly.
anthk 5 hours ago||
Lutris can up to 2016.
dgxyz 5 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.

psyclobe 23 minutes ago|||
But isn't that illegal now? You have to write everything in rust according to their cto.
raw_anon_1111 6 hours ago|||
And the 12 different ways to define a string depending on which API you call
sys_64738 2 hours 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.
moomin 3 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 2 hours 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 6 hours ago|||
Winforms?

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

pjc50 6 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 6 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 1 hour ago|||
It does, but many still think it is like using VB 6 and don't learn the additional APIs that provide that support, e.g. FlowLayoutPanel and TableLayoutPanel.

And for HiDPI, https://learn.microsoft.com/en-us/dotnet/desktop/winforms/hi...

Quarrelsome 34 minutes ago||||
I remember a marvelous quote from a guy that was at some MS conference and got handed a leaflet that said:

> WinForm or WPF, how to choose

and they were like: "the question I have isn't how to choose, but _why_ I have to choose".

bob1029 4 hours ago||||
I don't think it's abandoned and it looks like there is a lot of activity around the high DPI concern.

https://github.com/dotnet/winforms/issues?q=is%3Aissue%20sta...

ack_complete 57 minutes ago||||
Or, unless they've changed it, hardware accelerated rendering. Winforms was based on System.Drawing, which used GDI+, which was largely software rendering. This was confusing because GDI+ was not really related to GDI, which had and still does retain some hardware acceleration support. Even basic color fills start becoming an issue with a big window/monitor.

Winforms is also .NET based, so it's inaccessible if you don't want to write your UI in and take a dependency on .NET.

Quarrelsome 36 minutes ago||||
transparency as well. WinForm really struggles with the idea of stacking elements on top of one another where there is an arbitrary amount of transparency or tricky shapes. Its just not worth the hassle compared to WPF.
pjmlp 1 hour 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 2 hours ago|||
It's been a while since I've touched it, but IIRC they made WinForms play with Hi-DPI nicely.
lucianbr 6 hours ago|||
How does it look? I mean, what do the widgets look like?
cv5005 6 hours ago||
This was an MFC project, so your old standard win32 common controls that looks the same since 98 or so.
tibbydudeza 2 hours ago|||
Same here - our IOT device is a i5 running Windows IOT. Recently I switched from C++/Win32 to Golang and walk.
tsss 5 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 2 hours ago|||
Spotify would be remarkably improved if it became a simple enough gui to be excluded from this conversation.
troupo 4 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 2 hours 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 2 hours 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.

beagle3 1 hour ago||
Ahhm. At previous $DAYJOB, I inherited a WPF app written in 2012; I stumbled upon several WONTFIX bugs through the years - mostly having to do with shared memory bitmaps, having to manually call GC at times, and a host of other things.

Stable, but many issues. Stay away if you value your sanity and do anything nontrivial.

wolvoleo 6 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.

NetMageSCW 50 minutes ago||
That’s ironic given that the new Outlook and Teams are a mess because they are web apps instead of native apps.

Web apps cause have lots of trouble emulating proper native look and feel and often have wierd issues with things like consistent focus and keystroke navigation. They have all the dumb issues of Java apps with no improvements beyond not being Java and are slower and more memory heavy to boot!

hu3 2 hours ago|||
Speaking about Electron, for my own little tools I have been using TypeScript+Bun with Electrobun.

https://github.com/blackboardsh/electrobun

runjake 2 hours 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.

Note: Yes, I know that electrobun itself has videos on the README.md

aaomidi 5 hours ago||
When Microsoft themselves use electron to develop apps what expectations can we have on other devs?
wolvoleo 1 hour 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 5 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 2 hours 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 2 hours 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.

contextfree 33 minutes ago||
There are like three settings pages that use JavaScript and React Native, the vast majority of Settings is C++ and XAML/WinUI2
aaomidi 3 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 1 hour 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! =]

drnick1 2 hours 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.

vovavili 1 hour ago||
Why would the article mention Qt? Qt is native for a subset of Linux distributions, not Windows.
glitchc 1 hour ago|||
Yet we cannot consider Qt to be native app development since every app requires the Qt runtime. Native means system libraries only.
spacechild1 3 minutes ago|||
There is no Qt "runtime". Qt is just a library.

> Native means system libraries only.

Every non-trivial application will eventually use third-party non-system libraries.

I think "Native app development" has at least two meanings:

1. narrow meaning: the program uses a native UI toolkit (Win32, Cocoa)

2. broad meaning: the program targets one or more specific platforms and the UI is not not just a webview

Even with the narrow meaning, WxWidgets would qualify as "native development" (because it uses native UI toolkits under the hood), yet it is still a third-party library.

201984 1 hour 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 1 hour ago||
Why single out WebViews? Would you consider Flutter native? It renders widgets on its own just like a WebView does.
201984 40 minutes ago||
Most toolkits, including WebUI 3.0, render widgets on their own, so you can't distinguish just on that. I'd say anything written in an interpreted language is not native, and Javascript falls into that category. Dart at least is possible to compile ahead of time, and so is C#.
drnick1 1 hour ago|||
I have always considered Qt apps (even for Windows) to be native. Think of VLC, VirtualBox, etc.
KellyCriterion 1 hour ago||
...but it is comfortable and actually a PITA compared to any managed execution environment :-)

Sure, embedded systems are a different anmial...

jasonjei 2 hours 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…

Pesthuf 3 minutes ago||
Thanfully, you don't need to write p/invoke stuff yourself anymore. https://github.com/microsoft/cswin32 creates methods and all related structs for you. It's also AOT compatible (if you specify it). It works for calling C and COM functions.

I mean, not like this brings Windows development anywhere close to "modern", if anything, it feels like you're moving into the opposite direction, but at least this solves the "The modern APIs don't provide the specific functionality I need" problem that plagues all of Microsoft's "nice", "modern" abstractions…

sylens 6 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

Rohansi 46 minutes ago||
I'm assuming but the versions are not fully backwards compatible so you can't just ship the latest version, they would need to ship all. There almost ten .NET versions released after the one which ships in Windows. And a new version is released every year.

The author does mention that .NET does have distribution options which don't require the user to install the runtime. You can have it package the full runtime with your build, either as a bunch of files, a self-extracting executable, or a standalone AOT-compiled native executable.

The author mentioned that the AOT-compiled executable is 9 MiB which is unacceptable to them. The other options will need even larger. Personally I don't see 9 MiB as a big deal especially when the author would rather go with Electron which is larger at worst (bundled Chromium) and only inefficient at best (system WebView).

jayd16 4 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.

NetMageSCW 46 minutes ago||
No one suggesting using Windows Update to install new apps, they are suggesting the current .Net framework should be elevated to a first class Windows citizen and included with Windows installs and updated with Windows Update, and that seems like and obvious idea that should have been implemented when .Net Core became .Net.
Rohansi 43 minutes ago||
.NET versions are not fully backwards compatible. Would you like every Windows install to ship with over ten versions of the .NET runtime?
c-linkage 5 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 5 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 3 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 3 hours ago||
Core is compatible with non deprecated apis.

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

Kwpolska 1 hour 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.

NetMageSCW 42 minutes ago|
.Net has always been hugely backwards compatible and breaking e.g. .Net 8 apps which will run out of support in November 2026. How is constantly needing to update .Net any different from constantly needing to update any other part of Windows?

Ideally they would just install newer .Net releases side by side and uninstall .Net releases as they drop out of support.

More comments...