クイック設定ライクなアプリの作り方

概要

常駐系のアプリケーションを作成する場合、タスクトレイへの常駐 + アイコン周辺に一時的なUI表示、というパターンでの設計となるケースは多数あると思います。 例えばWindows標準に限ると、Win+Aで開く音量調整やWiFi接続の設定を行うUI(クイック設定)、OneDriveの同期状況表示等が例に挙がります。

このメモでは、もにまね作成時に得られたクイック設定同等なUIを作成するための記録を共有します。

クイック設定画面

結論・要約

  • UI再現の際は見た目だけでなくウィンドウのサイズや透過状況も把握することで、より正確かつ手を抜いた再現が可能
  • もにまねではUWP(WinUI2)のXaml Islandsを利用しており、容易さと再現性のバランスでは現時点の最適解
    • Direct Xを利用する解などについては未調査だが寄り再現性を高められる可能性はある
    • WPFやWinUI3は調査の結果、アニメーション関連での制約あり
    • UWPは.Net Core 3.1だけでなく、.NET 9以降でも使えるが情報は少な目

動作環境

下記メモは2025年末、Windows 11 25H2環境での動作を前提としています。 今後のアップデートにより挙動が変わる可能性がある点に注意してください。

クイック設定を知る(見た目編)

まずは、Windows 11のクイック設定画面をまねるに当たって構成要素を確認してみましょう。

クイック設定画面の要件

パッと見た感じや文章として示すだけの場合、そこまで難しい要件ではないように見えます。 実際、それぞれの要素要素はそこまで難しくないのですが組み合わせで面倒なケースが見えてきます。

1. 背景色は裏に合わせる

Windows 11では、Mica(マイカ)と呼ばれる塗られ方をするデザインが一般的なウィンドウ背景などに使われています。

マイカ素材 (Windows Learn)

マイカは、アプリや設定などの長時間のウィンドウの背景を塗り分け、テーマとデスクトップの壁紙を組み込んだ不透明で動的な素材です。

対してWindows 10では、Acrylic(アクリル)と呼ばれる塗り方が主流でしたが、一部用途ではWindows 11でも利用されています。

アクリル素材 (Windows Learn)

アクリルは、半透明のテクスチャを作成するブラシの一種です。 アクリルをアプリ サーフェスに適用すると、奥行きを加えたり、視覚的な階層を確立したりすることができます。

両者ともに背景の色に合わせて色が変わる点では共通していますが、Micaはデスクトップ壁紙、Acrylicはすぐ下の色を利用しています。 使い分けとしては長時間のMica/短時間のAcrylicとなっています。 上記のとおり、Windows11ではMicaだけでなくAcrylicも引き続き利用されており、クイック設定でもAcrylicが利用されています。

2. 周囲4辺には影

ウィンドウ端には影がついており、背景が白でもグレーに見えます。 特に意識せずにウィンドウを作成すればWindows管理で標準な影を落とすことが可能です。 しかし後述する通り位置・サイズ固定のウィンドウ特有の課題があるため独自実装が必要になります。

3. 個人設定で色付け

Windows 8および10以降、Windowsでの個人設定として各種色の設定が可能となっています。 押下済みのボタンなどをAccent Colorで色付けすることや、Light/DarkのThemeに応じて背景色の明暗を変える必要があります。 この際、単に起動時に色を取得するだけでなく、設定変更時にリアルタイムで反映させる必要も出てきます。 最近のUIフレームワークでは標準で追従してくれますが、条件次第ではアプリ側で変化を検知する必要が出ます。

4. 角丸の利用

Windows 11では、ウィンドウの角やUI要素の角が丸くなっています。 この角丸についてもOS標準でウィンドウの四隅は切り取ることができますが、こちらについてもしっかりとした作りこみのためには独自実装が必要でしょう。

5. 表示アニメーション

勢いよく滑ってきて、ゆっくり止まる。Easingの効いたアニメーションが採用されています。 もにまねでは、CubicBezier(3次ベジェ曲線)のEasing Function、表示:250ms、クローズ:167msで近似させています。 なるべく滑らかに動かすためには実装に工夫が必要ですが、多要素との兼ね合いで実装が困難になる原因でもあります。

クイック設定を知る(操作編)

見た目で分からなくてもよく確認すると変な仕様になっている部分も存在します。

影部分の実装

Win11で閲覧中の方は、スタートメニューとクイック設定の両者について、タスクバーとの隙間(一番下の影が出ている部分)をクリックしてみてください。 スタートメニューは閉じ、クイック設定は閉じない挙動が確認できたかと思います。 両者ともにMicrosoftが作成するタスクバーから起動するウィンドウであるにも関わらず挙動が異なります。

マウスクリックを透過する/しないの差が発生しているかのような挙動ですが、それも違います。 マウスカーソルを乗せると十字やI字に変わる、ペイントやメモ帳のようなアプリをスタートメニュー下に配置してもカーソルは変化しません。

上記から言えることは、スタートメニューは影をクリックしたらウィンドウを閉じる処理が入っており、クイック設定は影をクリックしても何もしないということです。

筆者が試す限りWindowsでは、色は付けられるが全面クリック透過なウィンドウ or 色が完全に透明な部分のみクリック透過なウィンドウ は実現可能ですが、色が不透明だが指定した領域のみクリック透過なウィンドウは実現はできなさそうでした。 影部分を完全にクリック透過するには、複数ウィンドウ(クリック透過な影を描く大きいウィンドウ + クリック非透過なUIパーツを描く小さいウィンドウ)を利用することになりそうでした。 もにまねでは、 Microsoftもサボってるみたいですし 影をクリック透過にするのは見送り、スタート同等の仕様で抑えました。

タスクバーなどに関する挙動

タスクバーを除いた領域を手軽に得る方法として作業領域(Work Area)の取得があります。 SystemParametersInfo関数のSPI_GETWORKAREAで取得可能な情報であり手軽にプライマリモニタのタスクバーを除いた長方形を得られます。 しかし、一般的な全画面表示アプリケーションとは異なりタスクバーから呼び出す都合で注意点が存在します。

作業領域について

タスクバーが自動的に隠れる設定になっている場合、作業領域はタスクバーが表示されていない状態の領域を返します。 しかし、クイック設定はタスクバーが表示されている状態を前提に表示する必要があり、タスクバーのサイズを確実にモニターサイズから減算する必要があります。

同様にアプリバー(アプリケーション デスクトップ ツールバー)がある場合も注意が必要です。 アプリバーはOneNoteの「表示/デスクトップの端に表示」などで利用される機能です。 アプリバーも作業領域から除外されますが、クイック設定の表示領域は作業領域とは異なるルールで決定されます。 具体的には右にあるアプリバーを無視し、下にあるアプリバーは被らないように尊重します。 アプリバーを右に出した場合アプリバーを下に出した場合

なお、OneDriveは単純に作業領域に表示するため、タスクバーに被ったり、右にアプリバーがあるとより左側に出現します。 さらなるイレギュラーケースとして、タブレットモードでのタスクバー(高さが変わる)への対応ができていませんが、現時点では未対応状況でのリリースとなっています。

タスクバーの表示制御

影部分の実装にて、スタートメニューとクイック設定で影部分のクリック挙動が異なることを説明しましが、タスクバー非表示時の挙動についても差異が存在します。 スタートメニューはタスクバーが非表示の状態で起動した場合、タスクバーが表示されるまで閉じない挙動となります。 対して、クイック設定はタスクバーが非表示の状態で起動した場合、タスクバーが表示されると同時に閉じる挙動となります。

なお、単純に実装するとクイック設定同様に画面表示すると同時にタスクバーが非表示になってしまいます。 Microsoftサボりすぎでは...

もにまねでは、スタートメニューと同様の挙動を採用しています。 具体的な方法として、独自ウィンドウの親ウィンドウをタスクバーに設定することで、タスクバーが非表示の状態で起動しても独自ウィンドウがアクティブな限り、タスクバーも表示状態を維持してくれます。

UIフレームワーク選定

2025年末時点でのWindows向けUIフレームワークとしては、WindowsForms、WPF、UWP(WinUI2)、WinUI3、MAUIなどが存在します。 透過処理、特にアクリル効果の再現に大きく関わるOSに近いレンダリング部分の視点で見ると、フレームワークは下記のとおりです。

Microsoft.UI.Composition
WinUI3(MAUI含む)
Windows.UI.Composition
UWP(WinUI2)
DirectComposition
(上記Composition系APIの内部で利用されている可能性はあるが直接利用は少ない)
DirectX
WPF、(他UIでも間接的な利用はされているはず)
GDI/GDI+
WindowsForms

Acrylic効果の実装手段

GitHubのselastingeorge/Win32-Acrylic-Effectを見ると涙ぐましい努力が垣間見れます。

横断的に利用可能なのはSetWindowCompositionAttributeです。 Win10時代から存在する非公開な利用法があり、ウィンドウ「全体に」アクリル効果を付与することが可能です。 このウィンドウ「全体」というのが厄介で、半透明な部分全体に影響が出てしまうため、影部分も含めてアクリル効果が付与されてしまいます。

把握している中では最も新しく、上記を公式化したような挙動をするのがMicrosoft.UI.CompositionのDesktopAcrylicControllerです。 こちらはウィンドウの枠(影部分)へのアクリル効果付与は避けられますが、完全な透過とアクリル効果を描き分けるようなことはやはりできません。

より高度な実装を簡単にできるのはWindows.UI.Compositionです。 BackgroundSource="HostBackdrop"AcrylicBrushでアクリル効果を持たせたい領域だけ塗れば良いです。

さらに細かい実装を行うとしたらDirectCompositionやDirectXを直接利用する方法もないことは無いようです。 しかし、非公式APIを利用することは避けられず、将来のOSアップデートで動作しなくなるリスクが高いですし、実装難易度も上がります。

なお、WPFについてはWindows11テーマへの対応作業が進んでいますが、MicaやAcrylicへのサポートはまだ対応中のようです。

上記の通り、ウィンドウ全体にアクリル効果を付与するだけであれば比較的容易に実装可能ですが

  • 角丸部分は透過
  • 影部分も透過
  • 出てくるアニメーション時もアクリル効果を維持
  • アニメーションをウィンドウの位置とサイズを変えて実装すると負荷が高い(滑らかに動きにくい)

などの課題があるため現時点では容易に実装するならWindows.UI.Composition系APIを利用するのが唯一の選択肢と思われます。

UWP利用時の注意点

UWP(WinUI2)は基本的にはWindows Storeアプリ向けのフレームワークですが、もにまねのようなデスクトップアプリからも利用可能です。 しかし、UWPを利用する場合はいくつか注意点があります。

App Container環境の制約

もにまねではUWPのAPIを利用してはいますが、狭義のUWPからは外れています。 狭義のUWP、すなわちApp Container環境で動作するUWPアプリの場合、セキュリティ制約の大きいサンドボックス環境で動作します。 ファイルへのアクセスなどの制約ももちろんありますが、今回のような用途の場合はウィンドウ制御に関する制約が問題となります。 具体的には、App Container環境のUWPアプリでは下記のような制約があります。

  • ウィンドウの位置やサイズを自由に変更できない
  • タイトルバーのカスタマイズが制限される(閉じるボタンを消せない)
  • 透過ウィンドウが作成できない

回避策がある可能性はありますが、もにまねではXaml Islandsを利用することでこれらの制約を回避しています。

Xaml Islandsの利用

Xaml Islandsは、UWPのXAML UIコンポーネントを従来のデスクトップアプリケーション(Win32アプリ)で利用するための技術です。 WinForms内でWPFを使うHwndSourceなどと同様に、Win32ウィンドウの上にXaml Islands管理のWin32ウィンドウが重なるような形で動作します。

なお、IXamlSourceTransparencyを利用することでXaml Islands管理される部分の透過も可能になります。 これを透明なWin32ウィンドウに重ねることで、影部分のような半透明な部分は半透明に、アクリル効果の部分はアクリル効果が施された内容でレンダリングされます。

.NETバージョンの注意点

Xaml IslandsはCOM/WinRT(Windows Runtime)の都合で.NET Core 3.1もしくは.NET 9以降でのみ動作し、.NET 5-8、.NET Framework系では基本的には動作しません。 もちろん、C++/WinRTを使う場合は.NETに依存しないため問題ありませんが、UIでC#を使う場合は注意が必要です。

また、.NET Core 3.1の頃はMicrosoft.Toolkit.Win32にて容易に扱えるような整備がなされていましたが、現時点ではサポートされていません。 そのため、.NET 9以降でXaml Islandsを利用する場合はWin32 API/WinRT呼び出しを自前で実装する必要があります。 幸いドキュメントはある程度整備されており、Microsoft.Toolkit.Win32のソースコードもあることから比較的容易に実装可能です。 特に.NET 9でのUWP利用については情報が少ないですが、Sergio Pedri氏のブログ記事GitHubでのDiscussionを参考にすることをお勧めします。

おわりに

本メモでは、Windows 11のクイック設定に似たUIを作成するための要件整理と、もにまねでの実装手法について共有しました。 UIの再現を行う場合の透過関連の都合で現時点ではUWP(WinUI2)のXaml Islands以外を採用することは難しいと結論付けられると思います。 もちろん、アニメーションの滑らかさを諦めて最新のWinUI3を採用するのも一つの選択肢です。 今後のアップデートで挙動が変わる可能性もありますが、参考になれば幸いです。

再読み込み