
2026/03/22 18:57
「Windows ネイティブ アプリの開発は、非常に混乱しています。」
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
要約
著者は、三画面構成でサイドモニタを黒く覆う「Display Blackout」という小さなユーティリティを作り、WindowsのスパズムとOLEDスクリーン上のピクセル浪費を防いだ。
これを実現するために必要だったことは次の通りである。
- ディスプレイとモニタ境界(変更監視付き)を列挙する。
- タイトルバーや枠がなく、アクティブ化されず、他のアプリより背後に保持される黒いウィンドウを作成する。
- グローバルキーボードショートカットを捕捉する。
- 任意で起動時に開始できるよう設定し、設定を永続化し、システムトレイアイコンとコンテキストメニューを表示する。
これらの作業には依然として P/Invoke やレガシーな Win32 API が必要である。モダンな Windows App SDK のツールは未完成であり、CsWin32 などのインタープラットフォームツールも(オプション/out パラメータや文字列構造体の扱い等)制限があるため、放棄される可能性が高い。
著者はネイティブ開発を好む理由としてノスタルジーと学びたいという欲求を挙げているが、現在のトレンドは Electron や Tauri に傾いている。
彼は Windows UI フレームワークの進化を追い、Win32 C API → MFC → WinForms (2002) → WPF (2006) → WinRT XAML (2012) → UWP XAML (2015) → WinUI 3(Windows App SDK 2021)と進化してきたことを指摘し、以下の点に注意を示した。
- WinUI 3 アプリを構築するには「ネイティブ C++」「フレームワーク依存型 C# / XAML」「.NET AOT」の三つの選択肢がある。
- フレームワーク依存型デプロイは、Windows 11 が標準で付属しているのは .NET 4.8.1 だけであり、より新しいランタイムをダウンロードしなければならないため、シームレスな体験が損なわれる。
- .NET AOT は簡易ユーティリティでも約9 MiBもの大きなバイナリを生成する。SDK の取り組みでは Rust バインディングは放棄された。
パッケージングの課題として、MSIX 証明書が高価(米国居住者以外で年間200〜300ドル)であり、署名されていない sideload を行うために必要な PowerShell コマンドが難解である点も挙げられる。
これらの障壁を踏まえ、著者はネイティブ Windows アプリ開発が低優先度に感じられると結論付ける。結果として、多くの開発者は Avalonia や Uno といったクロスプラットフォームフレームワークや Electron、Tauri などのウェブスタックへ移行しつつある。これらはツールが整備されておりデプロイも容易で幅広いプラットフォームをサポートする一方、深いネイティブ Windows 機能の採用速度を遅らせる可能性がある。
回答要約
- 欠落している要素: OLED ピクセル浪費回避、三画面コンテキスト、ノスタルジーによる動機、WinUI 3 の三つの構築オプション、Rust バインディング放棄、CsWin32 の制限、C# インタープラットフォームの短所。
- 推論/飛躍: CsWin32 の衰退予測と、ネイティブ機能採用への業界全体への影響に関する確信。
- 上記が改善された要約である。
本文
私はずっとWindows派です。
最初に読んだプログラミング本は Beginning Visual C++ 6 で、そこには試用版の Visual C++ が付属しており、10歳の私が親のパソコンにインストールできました。当時家族旅行中に .NET 1.0 がリリースされ、C# の書籍を読み漁りながら、MFC で作っていた Neopets 用チートプログラムを Windows Forms に書き直す準備をしていました。大学卒業後の最初の仕事も .NET 店舗でしたが、主にフロントエンド側に従事しました。
Windows 開発環境はサイドラインから眺めていたものの、プロとしてはネイティブ Windows アプリ(Chromium は技術的にはネイティブアプリですが、実際には独自 OS みたいな存在)を手掛けることはありませんでした。趣味プロジェクトではウェブが常に優れた選択肢でした。しかし、懐かしい思い出に突き動かされて、退職後のプロジェクトとして楽しい小さな Windows ユーティリティを作ってみようと思ったのです。
作成したもの
私が作ったユーティリティ Display Blackout は、3 つのモニタでゲームをプレイするときに左右のディスプレイを黒くしたいという欲求を満たしました。モニタをオフにすると Windows が数秒間ハングし、現在のウィンドウ配置が狂ってしまいます。OLED モニタでは黒いオーバーレイを表示するだけで全ピクセルを消すことができるので同じ効果です。
念のために言っておくと、これは独自発想ではありません。最初は AutoHotkey スクリプトを使っていましたが、この記事を書いた時点で完全な Windows アプリへ進化しています。他にも Microsoft Store で同様のアイデアを実装したものがあります。私は少し見た目を良くしてモダンにするだけでも学習目的としては十分だと考えました。
このアプリが必要とする機能は以下です:
- システム上のディスプレイとその境界領域を列挙
- ボーダーレス・タイトルバーなしで非アクティブ化された黒いウィンドウを配置
- グローバルキーボードショートカットを捕捉
- 任意でスタートアップに登録
- 永続的な設定を保存
- トレイアイコンと数項目のメニューを表示
これらを忘れずに進めましょう。
こんなに綺麗な UI を作ったんです。きっとこの分野の他ソフトより優れているでしょうね。
Windows プログラミングの簡単な歴史
- Win32 API (C) – 今も依然として重要
- MFC – 生の C 関数にオブジェクト指向を追加した C++ ライブラリ
- .NET が導入されたことで新しい言語 C# と JIT バイトコード、ガベージコレクションが登場。Windows Forms は最初の UI フレームワーク(2002)
- WPF (2006) – XAML をマークアップ言語として採用し、GPU で制御を描画
- WinRT (Windows 8, 2012) – デスクトップ・タブレット・電話向けにサンドボックス化されたアプリ。XAML は継続するが API が変わる
- UWP (Windows 10, 2015) – 制限を緩和したが、WPF を使った .NET アプリほど強力ではない
- WinUI 3 (Windows 11, 2021) – Windows App SDK 経由で WinRT/UWP 機能をすべての Windows アプリに公開
つまり進化は:
Win32 C API → MFC → WinForms → WPF → WinRT XAML → UWP XAML → WinUI 3
道筋上の分岐点
私は最新のファーストパーティ基盤を使いたいと考え、WinUI 3 アプリで Windows App SDK を利用する方法は次の 3 通りがあります:
- C++ – 軽量アプリ。SDK ライブラリにランタイムリンクし、Win32 C API と容易に相互運用
- C#/XAML(フレームワーク依存デプロイ) – C# バイトコードだけを配布し、Web アプリがブラウザプラットフォームを共有するような形。Windows 11 には .NET 4.8.1 がプリインストールされているが、新しい .NET はダウンロードが必要で UX が悪い
- C#/XAML(AOT) – .NET ランタイム全体をバイナリにコンパイル。小さなアプリでも約 9 MiB
「Rustはどう?」と思うかもしれません。Microsoft に隣接したプロジェクトで Windows App SDK の Rust バインディングを保守しようとしましたが、途中で諦めました。
配布
Windows は従来のインストーラとモダンな MSIX(コンテナ化されたインストール/アンインストール)をサポートしています。MSIX はコード署名証明書に大きく依存し、非米国居住者では年間 200–300 USD 程度かかります。署名されていない sideloading を行うには管理者ターミナルから謎めいた PowerShell コマンドを実行する必要があります。この問題を回避できる唯一の方法は Microsoft Store にアプリを入れることですが、今回は「独自の長期価値」を提供しなかったため却下されました。
置き去りにしたもの
各層が追加されるたびに、以前は利用可能だった機能が欠落したり、アクセスが難しくなったりします。.NET の P/Invoke を使っても Win32 API に戻ることが多いです。最新の相互運用ツール CsWin32 でも実装上のギャップがあり、構造体内の文字列を正しくラップできません。その制限は C# 自体に欠けている機能(例:省略可能な
[out] や [in, out] パラメータ)の表れです。
WPF が登場した当初、双方向データバインディングのボイラープレートが持続不可能でした。言語面で改善(イベントを発火する際にプロパティ名を省略できるなど)があっても、核心的な問題は残ります:C# は観測可能クラスを自然に作成する方法をまだ追加していないのです。
結論
ネイティブ Windows アプリ開発は Microsoft にとって低優先度であるように感じられます:
- バグやギャップが多く、エンジニアからの対応も少ない
- Windows App SDK のリリースノートは主に新しい機械学習 API を追加することに焦点を当てる
- VS Code、Outlook、スタートメニューなど主要なファーストパーティアプリはウェブ技術を採用
このためコミュニティの多くが Avalonia や Uno Platform といったサードパーティ UI フレームワークを採用し、クロスプラットフォーム開発を推進しています。だがそれらも高度な機能を実装する際には Win32 の相互運用が必要になるケースがあります。
現状を踏まえて私は Web スタック(Electron や Tauri)を選ぶ方が確かに楽で、必要に応じて Win32 API にアクセスできると考えています。Microsoft が改善できる点は:
- .NET 配布をよりシームレス化(例:Windows Update 経由)
- 他のパッケージが依存宣言できる MSIX 用 .NET パッケージを提供
- コード署名・sidestreaming の簡素化
将来、ネイティブアプリ開発が改善されるかどうかは不確定ですが、Windows 品質への注力と OS 全体で WinUI 3 をさらに広く使う動きに期待したいところです。