Windows native ऐप डेवलपमेंट इतना बिखरा हुआ क्यों है
(domenic.me)- Windows native ऐप डेवलपमेंट ecosystem दशकों से चले आ रहे framework fragmentation और बार-बार redesign की वजह से 2025 में भी वास्तविक developer productivity नहीं दे पा रहा है
- Win32 से MFC, WinForms, WPF, WinRT, UWP और WinUI 3 तक UI framework के 7 चरणों के बदलाव के बावजूद, केवल latest API से बुनियादी features तक implement करना कई मामलों में संभव नहीं है
- Tray icon, global shortcut intercept जैसे रोज़मर्रा के features अभी भी P/Invoke के जरिए Win32 call पर निर्भर हैं, जिससे modern framework अपनाने का मतलब फीका पड़ जाता है
- .NET AOT compilation से साधारण utility app build करने पर भी 9MiB से बड़ा binary बनता है, और MSIX distribution के लिए code signing certificate की सालाना लागत $200–300 जैसी व्यावहारिक बाधा मौजूद है
- Microsoft के अपने बड़े apps (VS Code, Outlook, Start Menu) वेब तकनीकों से बने हैं — यह इस बात का संकेत है कि Windows native development अब Microsoft के भीतर भी प्राथमिकता नहीं रहा
पृष्ठभूमि: क्या बनाया गया
- Windows-only utility app ‘Display Blackout’ बनाते समय मौजूदा native app development environment की समस्याएँ सामने आईं
- यह app multi-monitor environment में गेम खेलते समय बाएँ-दाएँ स्क्रीन को काले overlay से बंद करने वाला feature देता है
- ज़रूरी features में display enumeration, boundary calculation, global shortcut handling, tray icon दिखाना, startup पर auto-run, settings save आदि शामिल थे
- पहले से AutoHotkey script और Microsoft Store app मौजूद थे, लेकिन सीखने और UI सुधारने के उद्देश्य से इसे खुद बनाने की कोशिश की गई
- नतीजे में यह साफ़ हुआ कि Windows native app development environment बेहद जटिल और अक्षम है
Windows programming का इतिहास
- शुरुआत में C-आधारित Win32 API ही एकमात्र विकल्प था, और यह API आज भी प्रभावी है
- C++-आधारित MFC ने Win32 के ऊपर class, template जैसी object-oriented abstraction जोड़ी
- .NET 1.0(2002) के आने से C# भाषा, JIT bytecode VM, automatic memory management आए, और Windows Forms Win32 window/control API का wrapper था
- .NET 3.0(2006) का WPF XAML markup language लाया और GPU-आधारित control rendering के जरिए Win32 निर्भरता से निकलने की पहली कोशिश थी
- Windows 8(2012) का WinRT sandbox app model लेकर आया, जिसका लक्ष्य desktop, tablet और phone को unify करना था, लेकिन इसका XAML ढाँचा WPF से हल्का अलग था और इससे भ्रम पैदा हुआ
- Windows 10(2015) का UWP ने sandbox की कुछ सीमाएँ कम कीं, लेकिन यह WPF-स्तर के desktop privileges तक नहीं पहुँचा; कुछ OS features (push notifications, live tiles, Microsoft Store distribution) केवल WinRT/UWP तक सीमित रहे
- इसी कारण Chrome और Microsoft Office जैसे existing apps ने WinRT/UWP bridge apps को IPC से जोड़ने वाली असहज architecture अपनाई
- Windows 11(2021) का Windows App SDK ने WinRT/UWP-only features को standard C++ और .NET apps दोनों के लिए खोला, और WinUI 3 नाम की नई XAML-आधारित control library शामिल की
- UI framework evolution summary:
Win32 C APIs → MFC → WinForms → WPF → WinRT XAML → UWP XAML → WinUI 3
development approach चुनने की दुविधा
- WinUI 3 app development के लिए तीन रास्ते हैं:
- C++: lean binary, Win32 C API के साथ आसान interop — लेकिन memory safety नहीं
- C#/XAML + framework-dependent distribution: modern Windows 11 में भी केवल .NET 4.8.1 preinstalled है, इसलिए पहली install पर .NET library download dialog दिखता है, जो खराब user experience देता है
- C#/XAML + .NET AOT: पूरा .NET runtime (VM, GC, standard library) binary में शामिल — साधारण app भी 9MiB से बड़ा binary बना देता है
- Rust bindings को बनाए रखने की कोशिश (windows-app-rs) archived हो चुकी है
- distribution का तरीका चुनना भी मुश्किल है:
- MSIX format के लिए code signing certificate चाहिए, जिसकी लागत अमेरिका के बाहर रहने वालों के लिए सालाना $200–300 है
- unsigned sideload के लिए admin terminal में ही चलने वाला जटिल PowerShell command चाहिए
- Microsoft Store registration को “मौलिक और निरंतर value” न देने के कारण reject कर दिया गया
वे features जो latest SDK में भी संभव नहीं
| सुविधा | Windows App SDK समर्थन स्थिति |
|---|---|
| display enumeration | आंशिक रूप से संभव (foreach loop नहीं, बदलाव detect करने के लिए P/Invoke चाहिए) |
| inactive black window placement | आंशिक रूप से संभव (non-activating के लिए P/Invoke चाहिए) |
| global keyboard shortcut intercept | असंभव — P/Invoke चाहिए |
| startup पर auto-run | संभव (system settings integration API उपलब्ध) |
| settings persistence | संभव |
| tray icon + menu | असंभव — P/Invoke चाहिए, menu style standard नहीं |
- Tray icon menu style हर app में अलग-अलग है; पूरे OS में कोई एकसमान standard नहीं
- WPF से WinUI 3 तक आते-आते window size auto-adjustment जैसी बुनियादी सुविधा भी गायब हो गई
C# और Win32 interop की संरचनात्मक सीमाएँ
- modern P/Invoke tool CsWin32 में bug है, जिसकी वजह से यह struct के अंदर की strings को सही तरह wrap नहीं कर पाता
- CsWin32 documentation साफ़ कहता है कि Win32 API के मूल parameter type
[optional, out]को C# में idiomatic तरीके से व्यक्त करने का तरीका नहीं है, इसलिए वही method दो versions में generate किया जाता है - WPF release(2006) के 20 साल बाद भी UI binding के लिए class लिखने वाला boilerplate लगभग वैसा ही है
- हर property को getter/setter pair में बदलना, same-value guard लगाना, event trigger call लिखना जैसी दोहराव वाली code अभी भी चाहिए
- JavaScript के decorators/proxies जैसा language-level समाधान 20 साल में भी C# में नहीं आया
- CsWin32 का changelog कमज़ोर है और यह अब भी 1.0 से पहले के version पर अटका है, इसलिए कुछ वर्षों में project छोड़े जाने की आशंका दिखती है
निष्कर्ष: Electron ही जवाब क्यों है
- अभी Microsoft native app development को प्राथमिकता नहीं दे रहा
- संबंधित issue trackers bugs और reports से भरे हैं, लेकिन Microsoft engineers की प्रतिक्रिया लगभग नहीं के बराबर है
- Windows App SDK का changelog machine learning APIs जोड़ने पर केंद्रित है
- VS Code, Outlook, Start Menu जैसे Microsoft के प्रमुख apps का web technologies पर बना होना इस बात का सबूत है
- community Avalonia, Uno Platform जैसे third-party UI frameworks की ओर जा रही है
- ये WPF की philosophy को आगे बढ़ाते हैं और cross-platform support को मज़बूत करते हैं
- फिलहाल Electron या Tauri जैसे web-based frameworks ज़्यादा व्यावहारिक विकल्प हैं
- TypeScript/React/CSS का संयोजन C#/XAML से अधिक productive है
- Win32 API access भी संभव है
-
Tauriमें system WebView का उपयोग होता है, इसलिए Chromium bundle की ज़रूरत नहीं पड़ती
- WebView2 runtime हर 4 हफ्ते में update होता है, जबकि system .NET 4.8.1 पर अटका हुआ है
- अगर Microsoft Windows App SDK में सुधार और distribution system को सरल बनाता है तो वापसी की संभावना हो सकती है
- लेकिन फिलहाल ज़्यादातर developers ऐसी उम्मीद नहीं रखते
- निष्कर्ष अंततः “मैं web stack चुनूँगा” पर पहुँचता है
- Microsoft की हाल की Windows quality पर केंद्रित घोषणा में पूरे OS में WinUI 3 का अधिक उपयोग करने की बात शामिल है, लेकिन इससे वास्तविक सुधार होगा या नहीं, यह अभी भी स्पष्ट नहीं है
3 टिप्पणियां
Electron के जरिए इसे सामान्य बना देने के लिए धन्यवाद...
बस यही चाहत है कि Winui 3 का WYSIWYG कब आएगा।
Hacker News की राय
मुझे भी लगता है कि दूसरों की तरह Win32 पर टिके रहना सही है
लंबे समय से Win32 में डेवलपमेंट करने के अनुभव से कहूँ तो, ज़रूरी फीचर 8KB से छोटे standalone executable में भी पर्याप्त रूप से लागू किए जा सकते हैं
display enumeration, window creation, shortcut hooking, startup program registration, settings save करना, tray icon दिखाना—ये सब कुछ सौ bytes के API calls से किया जा सकता है
लेकिन 2026 में नया project memory-safe नहीं होने वाली language (C++) में लिखना समय के खिलाफ चलने जैसा है
फिर भी, अगर app में untrusted input लगभग नहीं है, तो बेवजह प्रचार (Propaganda) से प्रभावित होने की ज़रूरत नहीं है
_UNICODEजैसी समस्याओं से बचना है, तो .NET Framework के साथ आधे समय में वही चीज़ बनाई जा सकती हैमेरा मानना है कि “NoFramework” आंदोलन फिर से आना चाहिए ताकि हम RAD युग में लौट सकें
लेकिन नए project में C++ चुनते समय सावधानी ज़रूरी है
memory-safe languages से भी Win32 इस्तेमाल किया जा सकता है — उदाहरण के लिए windows-rs
उस समय Borland Delphi सबसे लोकप्रिय tool था
अगर बात पुराने WinRT, UAP, UWP apps की नहीं है, तो WinUI 3.0 या WinAppSDK से बचना चाहिए
Win32, MFC, WinForms, WPF जैसी proven technologies का इस्तेमाल जारी रखना बेहतर है,
और Microsoft के बाहर के ecosystem में Qt, VCL, Firemonkey, Avalonia, Uno, ImGUI आदि पर विचार किया जा सकता है
WinUI 3.0 इतना बिखरा हुआ है कि Microsoft खुद भी इसे community को open source के रूप में सौंपने की कोशिश कर रहा है
बाद में WinJS open source web framework में बदल गया और official support खत्म हो गया
संबंधित blog post
मैं embedded developer हूँ, और device से communicate करने वाला Win32 GUI program बनाना अब भी आसान है
XP ज़माने का code Windows 11 पर भी वैसे का वैसा चला, और VC6 project को Visual Studio 2022 में खोलकर भी बिना दिक्कत build किया गया
ऐसी backward compatibility दूसरे platforms पर कम ही देखने को मिलती है
Apple का Cocoa structure में “elegant” लगता है, लेकिन व्यवहार में जटिल है और documentation भी खास मददगार नहीं है
शुद्ध Win32 API अब भी एक व्यावहारिक विकल्प है
अगर C++ में MFC जैसी wrapper खुद बना ली जाए, तो 2–3 हफ्तों में तैयार की जा सकती है, और उसके बाद पूरा control अपने हाथ में रहता है
Microsoft की मज़बूत backward compatibility की वजह से Win32 आधारित apps लंबे समय में स्थिर रहते हैं
10 साल से ज़्यादा समय तक update किए गए उदाहरण यहाँ देखे जा सकते हैं
system colors और controls hard-coded हैं, इसलिए वे dark theme से टकराते हैं
menu, message box, file dialog जैसे कुछ UI ही dark mode support करते हैं, इसलिए consistency टूट जाती है
संबंधित चर्चा के लिए यह लेख देखें
अभी यह open source के रूप में maintain हो रहा है और version 10 तक आ चुका है
Windows apps कई बार बनाने के अनुभव से,
(1) Win32 API पुराना है लेकिन बहुत स्थिर है, और
(2) Microsoft-owned UI toolkits से बचना चाहिए — आखिरकार Win32 level control की ज़रूरत पड़ती ही है
पिछले 20 सालों में Microsoft की अधिकांश UI technologies किसी न किसी रूप में WPF की ही variations थीं
अगर WPF को लगातार आगे बढ़ाया गया होता, तो आज तक यह UI development का standard बन चुका होता
उपयोगकर्ता के नज़रिए से native apps तेज़ और अच्छे लगते हैं, लेकिन development वाकई जटिल अव्यवस्था है
Outlook और Teams जैसे apps के लगातार खराब होने की एक वजह यह भी है
focus, keyboard navigation जैसी चीज़ों में native feel की नकल करना मुश्किल है
Electrobun project देखें
“C++ में नया project बनाना अपराध है” इस बात से मैं सहमत नहीं हूँ
GUI में safety से ज़्यादा performance और control मायने रखते हैं, और C++ अब भी एक proven language है
Qt 2026 में भी बेहतरीन GUI frameworks में से एक है, और इसमें memory safety features built-in हैं
यह सवाल उठता है कि आधुनिक .NET runtime Windows 11 में default रूप से शामिल क्यों नहीं है
यह Microsoft द्वारा consistent user experience छोड़ देने का एक और उदाहरण लगता है
इसलिए Windows Update के जरिए सबको distribute करना व्यावहारिक नहीं है
इसके बजाय AOT-compiled standalone executable के रूप में distribute किया जा सकता है (लगभग 9MiB)
यह Electron से कहीं छोटा और अधिक efficient है
अब DLLs को साथ package करना बेहतर है
इसलिए इसे OS में embed करना मुश्किल हो गया
तेज़ release cycle बनाए रखने के लिए इसे OS updates से अलग किया गया
जबकि .NET Core अलग से install करना पड़ता है
काफी समय बाद मैंने Tauri से Windows और Mac के लिए app बनाया,
development और build आसान थे, लेकिन code signing की समस्या के कारण सहकर्मी इसे install नहीं कर सके
Mac पर इसे terminal command से हल किया गया, लेकिन Windows में Smart App Control बंद करना पड़ा
और इस feature को reinstall किए बिना फिर से चालू नहीं किया जा सकता
सुरक्षा का उद्देश्य समझ में आता है, लेकिन install process इतनी कठिन होगी, यह उम्मीद नहीं थी
“Electron क्यों नहीं इस्तेमाल करते?” इसका जवाब सरल है —
Electron apps का user experience खराब होता है
development आसान होता है, लेकिन performance और quality की कीमत चुकानी पड़ती है
अगर अच्छा product बनाना है, तो मुश्किल होने पर भी native रास्ता चुनना चाहिए
व्यक्तिगत रूप से मुझे C# TypeScript से कहीं बेहतर लगता है