Windows 11のタスクバーに自分のアプリUIを載せられるライブラリを作りました
(github.com/airtaxi)最近、Windows 11のタスクバー内にアプリのUIを直接差し込めるライブラリを公開しました。名前は Deskband11Lib で、NuGetからインストールすれば WinUI 3 や WPF アプリをタスクバーウィジェットにできます。
なぜ作ることになったのか、どう動くのか、そして実際に Store に公開した PoC ウィジェットまで続けて説明します。
背景: Windows 11で消えたデスクバンド
Windows 10までは、タスクバーに小さなツールバーを表示する デスクバンド(Deskbands) 機能がありました。Windows 11に移行して、この機能はまるごとなくなってしまいました。メディアコントロール、システムモニター、クイック起動のような「常に表示される小さなウィジェット」をタスクバーに置きたい立場からすると、かなり残念な変更でした。
着想: zadjii の Deskband11
少し前に GitHub で zadjii/Deskband11 を見たのですが、その中核となるアプローチが本当に見事でした。
タスクバーの上に透明な WinUI 3 ウィンドウを1つ重ね、そのウィンドウをタスクバーの子 HWND として
SetParentし、コンテンツサイズに合わせてクリップ領域を設定して、あたかもタスクバーの一部のように見せること。
要するに「タスクバーの上に浮いているウィンドウにすぎない」のですが、この発想がとても巧妙でした。ただ、元のプロジェクト自身も「ハッカソン級のコード」だと述べていて、実際の製品に持ち込むには足りない点がありました。
そこでライブラリ化しました
もったいないアイデアだったので、dotnet add package 1行で誰でも使えるように、ライブラリとして作り直しました。
- GitHub: https://github.com/airtaxi/Deskband11Lib
- NuGet:
Deskband11Lib.WinUI/Deskband11Lib.Wpf
使い方は簡単です
WinUI 3 のウィンドウを1つ作って TaskbarContentHost に渡せば終わりです。
var window = new MainWindow();
var host = new TaskbarContentHost(window, rootElement, new TaskbarContentHostOptions
{
PreferredWidth = 360,
PreferredHeight = 48
});
await host.AttachWhenLayoutReadyAsync();
window.Activate();
WPF でも API はほぼ同じです。タスクバーの配置(左揃え/中央揃え)の検出、スタートボタンおよび通知領域との重なり回避、Explorer 再起動時の復旧、レイアウト変更アニメーションまで、ライブラリが自動で処理します。
動かすまでにかなり時間がかかりました
元のコードをそのまま動かしてみると実行はできたのですが、ウィンドウの位置やサイズが妙にずれていたんです。元がハッカソン時に書かれたコードだったので、Windows 11 のアップデートでタスクバー実装が変わったせいなのか、それとも元のコード自体がもともとずれていたのか、最初は判断がつきませんでした。どちらも原因になり得たので、タスクバーまわりを一つずつ分解しながら、現在のビルドで実際にどう取得されるのかを直接確認するしかありませんでした。しかも元の実装は、スタートボタンが中央に来るケースやウィジェットボタンのような要素をまったく考慮していなかったため、ライブラリ化するにあたって新たに対応する必要がありました。
そのため、元の実装では UI Automation の使い方と、ウィンドウサイズ/位置を取得する Win32 API 程度だけを参考にし、空き領域を計算するロジック自体は最初から書き直しました。スタートボタン、タスクバーのアプリアイコン群、ウィジェットボタン、通知領域の位置を読み取って残りの空間を求める必要があるのですが、タスクバーの配置が左寄せか中央寄せかによって余白ができる場所も変わるため、こうした点も新たに考慮しなければなりませんでした。
実際にアプリを1つ作って Store に公開しました: BarPlay
ライブラリが本当に実用になるのか確かめたくて、これでアプリを1つ作り、Microsoft Store に登録しました。名前は BarPlay です。
タスクバーに現在再生中のメディアのサムネイル、タイトル、コントロールを表示するウィジェットです。Spotify、ブラウザー、YouTube PWA アプリなど、Windows のシステム メディア コントロール(SMTC)をサポートするアプリならすべて動作します。NativeAOT でコンパイルし、起動速度とリソース使用量を最小化しました。
まず身近な知人たちに紹介してみたのですが、反応はかなり良かったです。
どこに使えるのか
WinUI 3 や WPF で作るコンテンツを、別ウィンドウを開かなくても常に見える場所に置けます。タイマー、メディア再生コントロール(BarPlay のようなもの)、ビルド状況や CI 通知、システムモニター、クイックランチャーやアカウント切り替え、通知インジケーターといった用途が考えられそうです。
自分のアプリのコントロールやスタイルをそのまま持ち込みつつタスクバーに載せられるので、デスクバンドがなくなった Windows 11 でこうした体験を実現できる、ほぼ唯一の .NET ライブラリだと思います。
リンク集
- Deskband11Lib (ライブラリ)
- NuGet (WinUI)
- NuGet (WPF)
- BarPlay (Proof of Concept, Store)
- BarPlay (ソースコード)
- 元になった着想 (zadjii/Deskband11)
MIT ライセンスで、サンプルプロジェクト(Deskband11Lib.WinUI.Sample, Deskband11Lib.Wpf.Sample)をコピーして始められます。フィードバック、Issue、PR はどれも歓迎です。面白いタスクバーウィジェットができたらぜひ教えてください。
2件のコメント
おお、アイデアすごくいいですね
ありがとうございます! 実際にはライブラリ化しただけで、もともと作られた方のアイデアのおかげだと思っています……(笑)