「Windows ネイティブ アプリの開発は、非常に混乱しています。」

2026/03/22 18:57

「Windows ネイティブ アプリの開発は、非常に混乱しています。」

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

要約

著者は、三画面構成でサイドモニタを黒く覆う「Display Blackout」という小さなユーティリティを作り、WindowsのスパズムとOLEDスクリーン上のピクセル浪費を防いだ。
これを実現するために必要だったことは次の通りである。

  1. ディスプレイとモニタ境界(変更監視付き)を列挙する。
  2. タイトルバーや枠がなく、アクティブ化されず、他のアプリより背後に保持される黒いウィンドウを作成する。
  3. グローバルキーボードショートカットを捕捉する。
  4. 任意で起動時に開始できるよう設定し、設定を永続化し、システムトレイアイコンとコンテキストメニューを表示する。

これらの作業には依然として 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 プログラミングの簡単な歴史

  1. Win32 API (C) – 今も依然として重要
  2. MFC – 生の C 関数にオブジェクト指向を追加した C++ ライブラリ
  3. .NET が導入されたことで新しい言語 C# と JIT バイトコード、ガベージコレクションが登場。Windows Forms は最初の UI フレームワーク(2002)
  4. WPF (2006) – XAML をマークアップ言語として採用し、GPU で制御を描画
  5. WinRT (Windows 8, 2012) – デスクトップ・タブレット・電話向けにサンドボックス化されたアプリ。XAML は継続するが API が変わる
  6. UWP (Windows 10, 2015) – 制限を緩和したが、WPF を使った .NET アプリほど強力ではない
  7. 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 通りがあります:

  1. C++ – 軽量アプリ。SDK ライブラリにランタイムリンクし、Win32 C API と容易に相互運用
  2. C#/XAML(フレームワーク依存デプロイ) – C# バイトコードだけを配布し、Web アプリがブラウザプラットフォームを共有するような形。Windows 11 には .NET 4.8.1 がプリインストールされているが、新しい .NET はダウンロードが必要で UX が悪い
  3. 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 をさらに広く使う動きに期待したいところです。

同じ日のほかのニュース

一覧に戻る →

2026/03/23 3:23

**PC Gamer 推奨RSSリーダー(37 MBの記事でダウンロードが止まらない場合)** - **Feedly** - クラウドベースでデバイス間同期が可能。 - カテゴリー分けやタグ付け機能が充実しています。 - **Inoreader** - 高度なフィルタリングと検索機能を備えています。 - オフライン閲覧モードもサポートします。 - **The Old Reader** - シンプルで軽量、Googleアカウント連携が可能です。 - 共有リストやコメント機能があります。 - **NewsBlur** - AIによるトピック分類と学習機能を提供。 - モバイルアプリも充実しています。 - **Reeder (macOS/iOS)** - Appleデザインに合わせた直感的なUIです。 - 多数のリーダーサービスと連携可能です。 **注意点** - 大容量の記事をダウンロードし続ける場合は、**「オフライン保存」機能**をご利用ください。 - **キャッシュクリア**や**ブラウザ拡張機能無効化**で問題が解決することもあります。 - それでも解決しない場合は、PC Gamerのサポートへ問い合わせるか、別のリーダーを試してください。

## Japanese Translation: PC Gamerの記事は、読者に通知ポップアップ、背景を暗くするニュースレターオーバーレイ、そして少なくとも5つの閉じにくいバナー広告でページを襲撃していることを示しています。ウェルカムマットを回避した後でも、その広告は記事のタイトルとサブタイトルの横に残ります。初期ページロードは37 MBです;5分以内にサイトはさらに約0.5ギガバイトの広告素材をダウンロードします。NetNewsWire、Unread、Current、Reeder など多くの RSS リーダーはこれらの侵襲的要素をフィルタリングでき、よりクリーンな閲覧体験を提供します。これはユーザーが PC Gamer サイトの煩わしさを避けるために広告なしの RSS フィードに切り替える可能性があることを示唆しており、出版社は読者の関与を維持するために過度な広告戦術を減らす圧力を受けるかもしれません。

2026/03/23 4:02

「最適化のゴールドスタンダード:ローラーコースター・タイクーンの内部を探る」

## Japanese Translation: クリス・ソーヤーの *RollerCoaster Tycoon*(1999)は、ほぼすべてのコードをアセンブリで書き、細部にわたる低レベル最適化を施したことで、滑らかなゲームプレイのベンチマークを確立しました。金額は最大想定範囲にちょうど合ったデータ型(ショップ価格は1バイト、総公園価値は4バイト)で保存されており、後にオープンソース再実装 OpenRCT2 ではこれらを統一的な8バイト変数へ移行し、現代のCPUアーキテクチャに合わせました。乗算・除算の代わりにビットシフト(`<<`/`>>`)が使用されており、コンパイラが自動で行うはずだった処理を手動で実装しています。 ゲームデザインの決定は性能制約と密接に結びついています。ソーヤーはデザイナー兼プログラマーとして、CPUフレンドリーな計算を優先する設計選択が可能でした。ゲストの移動はアトラクションへ向かう完全な経路探索ではなくランダムウォークに依存しており、多数のエージェントによる高価な計算を大幅に削減しました。パスファインディングは特定のシナリオ(例:乗物修理のメカニック、出口を探すゲスト)でのみ呼び出され、深さ制限が設けられています—デフォルトでは5つのジャンクション、条件に応じて7または8に増加し、フレームスパイクを回避します。混雑した道では同一タイルに複数のゲストが存在でき、衝突回避は完全に省かれ、近接による幸福度計算のみが影響を受けます。 OpenRCT2 はこの元のロジックをリバースエンジニアリングし、現代CPU向けに変数サイズを標準化し、パスファインダーの制限を拡張することで更新しました。これにより、レガシートリックが新しいハードウェアに適応できることが示されました。将来のアップデートでは、衝突チェックや厳密なデータサイズといった古い制約を緩和しつつ、今日のマシンで性能を損なわずにコア体験を保持することが可能です。 これらの洞察は、デザイナーとプログラマーの緊密な協働と意図的な低レベル最適化が、小規模チームでも高性能ゲームを構築できることを示しており、大手スタジオも採用すべきアプローチです。 ## Text to translate (including missing points):** Chris Sawyer’s *RollerCoaster Tycoon* (1999) set a benchmark for smooth gameplay by writing almost all of its code in Assembly and applying meticulous low‑level optimizations. Money values were stored in data types sized exactly to their maximum expected range (1‑byte for shop prices, 4‑bytes for total park value), and the original engine later shifted these to uniform 8‑byte variables in the open‑source reimplementation OpenRCT2 to match modern CPU architecture. Bit shifting (`<<`/`>>`) was used instead of multiplication/division by powers of two, a manual trick that compilers no longer perform automatically. Game‑design decisions were tightly coupled with performance constraints: Sawyer served as both designer and programmer, allowing design choices to favor CPU‑friendly calculations. Guest movement relied on random walking rather than full pathfinding toward attractions, drastically reducing expensive calculations for thousands of agents. Pathfinding was invoked only in specific scenarios (e.g., mechanics repairing rides, guests seeking exits) and had a depth limit—default 5 junctions, increased to 7 or 8 under certain conditions—to avoid frame‑spikes. Overcrowded paths allowed multiple guests on the same tile; collision avoidance was omitted entirely, with only happiness calculations affected by proximity. OpenRCT2 reverse‑engineered this original logic and modernized it—standardizing variable sizes for current CPUs and extending pathfinder limits—showing how legacy tricks can be adapted to new hardware. Future updates could relax some of these old constraints (such as collision checks or strict data sizing) without harming performance on today’s machines while still preserving the core experience. These insights underscore that close collaboration between designers and programmers, coupled with deliberate low‑level optimization, enables small teams to build high‑performance games—an approach larger studios might emulate.

2026/03/23 0:16

**バージョン管理の未来** バージョン管理は、従来型のリポジトリやブランチモデルを超えて進化しています。新たに浮上している動向としては、AI 主導の変更分析、分散したチーム間でのリアルタイム協働、および継続的デリバリー・パイプラインとの緊密な統合が挙げられます。コードベースがより大規模かつ複雑化するにつれて、これらの革新はワークフローを合理化し、マージコンフリクトを減少させ、全体的なソフトウェア品質を向上させることを約束しています。

## Japanese Translation: **Manyana** は、Conflict‑Free Replicated Data Types(CRDTs)がバージョン管理にどのように利用できるかを示すデモプロジェクトです。ユーザー体験を向上させます。 ファイルは *weave* として表現されます——1 つのデータ構造が、追加または削除された各行とメタデータを記録し、行順序を永続化し、同時挿入に対してマージ全体で一貫した順序を提供します。 CRDTs は順序非依存ですので、マージが失敗することはありません。衝突はファイルの同じ部分を編集したときだけ発生し、不透明なマージブロブではなく明確な競合マーカーが生成されます。 システムはまた、リベースが履歴を破壊せずに行えることも示しています:コミットは新しいベース上で再実行され、「プライマリー・アニサスター」注釈によって完全な祖先関係が保持されます。 チェリーピッキングとローカル Undo はまだ実装されていませんが、470 行の Python デモ(パブリックドメイン)は、CRDTs がバージョン管理における難しい UX 問題を解決し、現在のツールよりも明確な競合表示を提供できることを示しています。

「Windows ネイティブ アプリの開発は、非常に混乱しています。」 | そっか~ニュース