Ich habe eine Bibliothek erstellt, mit der ich meine App-UI in die Windows-11-Taskleiste einfügen kann.
(github.com/airtaxi)Vor Kurzem habe ich eine Bibliothek veröffentlicht, mit der sich App-UI direkt in die Windows-11-Taskleiste (taskbar) einfügen lässt. Sie heißt Deskband11Lib und kann per NuGet installiert werden, um WinUI-3- oder WPF-Apps als Taskleisten-Widgets zu erstellen.
Ich erkläre im Folgenden, warum ich sie gebaut habe, wie sie funktioniert und schließlich auch das PoC-Widget, das ich tatsächlich im Store veröffentlicht habe.
Hintergrund: Das in Windows 11 verschwundene Deskband
Bis Windows 10 gab es die Funktion Deskbands, mit der sich kleine Werkzeugleisten in der Taskleiste anzeigen ließen. Mit dem Wechsel zu Windows 11 ist diese Funktion vollständig verschwunden. Für alle, die „kleine Widgets, die immer sichtbar sind“ wie Mediensteuerung, Systemmonitor oder Schnellstart in der Taskleiste haben möchten, war das eine ziemlich bedauerliche Änderung.
Inspiration: zadjiis Deskband11
Vor einiger Zeit bin ich auf GitHub über zadjii/Deskband11 gestolpert, und der Kernansatz war wirklich großartig.
Ein transparentes WinUI-3-Fenster über die Taskleiste legen, dieses Fenster per
SetParentals Child-HWND der Taskleiste setzen und dann einen Clip-Bereich passend zur Content-Größe festlegen, sodass es wie ein Teil der Taskleiste aussieht.
Am Ende ist es „nur ein Fenster, das über der Taskleiste schwebt“, aber die Idee dahinter war ausgesprochen clever. Das Originalprojekt bezeichnete sich allerdings selbst als „Hackathon-Level-Code“ und hatte einige Schwächen, die den Einsatz in einem echten Produkt erschwerten.
Deshalb habe ich daraus eine Bibliothek gemacht
Weil die Idee zu schade zum Liegenlassen war, habe ich sie als Bibliothek neu umgesetzt, sodass sie jeder mit einer einzigen dotnet add package-Zeile nutzen kann.
- GitHub: https://github.com/airtaxi/Deskband11Lib
- NuGet:
Deskband11Lib.WinUI/Deskband11Lib.Wpf
Die Verwendung ist einfach
Man erstellt ein WinUI-3-Fenster und übergibt es an TaskbarContentHost – das ist alles.
var window = new MainWindow();
var host = new TaskbarContentHost(window, rootElement, new TaskbarContentHostOptions
{
PreferredWidth = 360,
PreferredHeight = 48
});
await host.AttachWhenLayoutReadyAsync();
window.Activate();
Bei WPF ist die API fast identisch. Die Bibliothek kümmert sich selbst um das Erkennen der Taskleisten-Ausrichtung (links/zentriert), das Verhindern von Überlappungen mit Start-Button und Benachrichtigungsbereich, die Wiederherstellung nach einem Explorer-Neustart und sogar um Layout-Änderungsanimationen.
Es hat einiges an Zeit gekostet, das zuverlässig zum Laufen zu bringen
Als ich den Originalcode unverändert ausprobiert habe, lief er zwar, aber Position und Größe des Fensters wurden falsch berechnet. Weil der Originalcode während eines Hackathons entstanden ist, war anfangs schwer zu sagen, ob sich die Taskleisten-Implementierung durch Windows-11-Updates geändert hatte oder ob der Code von Anfang an nicht ganz stimmte. Da beides möglich war, blieb nichts anderes übrig, als die Taskleiste Stück für Stück zu zerlegen und direkt zu prüfen, wie sie sich im aktuellen Build tatsächlich verhält. Außerdem berücksichtigte das Original weder den Fall, dass der Start-Button zentriert ist, noch Elemente wie den Widgets-Button, sodass ich mich bei der Bibliotheksfassung zusätzlich darum kümmern musste.
Deshalb habe ich aus dem Original im Grunde nur die Verwendung von UI Automation und einige Win32-API-Ansätze für Fenstergröße und -position übernommen; die Logik zur Berechnung des freien Bereichs habe ich von Grund auf neu geschrieben. Dafür muss man die Positionen von Start-Button, Taskleisten-App-Button-Gruppe, Widgets-Button und Benachrichtigungsbereich auslesen, um den verbleibenden Platz zu bestimmen. Je nachdem, ob die Taskleiste links oder zentriert ausgerichtet ist, entsteht der freie Raum außerdem an unterschiedlichen Stellen – auch das musste neu berücksichtigt werden.
Ich habe tatsächlich eine App damit gebaut und im Store veröffentlicht: BarPlay
Um zu prüfen, ob die Bibliothek wirklich alltagstauglich ist, habe ich damit eine App gebaut und im Microsoft Store veröffentlicht. Sie heißt BarPlay.
Das Widget zeigt in der Taskleiste Thumbnail, Titel und Bedienelemente des aktuell abgespielten Mediums an. Es funktioniert mit allen Apps, die Windows System Media Transport Controls (SMTC) unterstützen, darunter Spotify, Browser und YouTube-PWA-Apps. Ich habe es mit NativeAOT kompiliert, um Startzeit und Ressourcenverbrauch zu minimieren.
Ich habe es zunächst einigen Bekannten gezeigt, und die Reaktionen waren ziemlich gut.
Wofür kann man es verwenden?
Mit WinUI 3 oder WPF erstellte Inhalte lassen sich an einer immer sichtbaren Stelle platzieren, ohne ein separates Fenster zu öffnen. Denkbar sind etwa Timer, Mediensteuerung (wie bei BarPlay), Build-Status oder CI-Benachrichtigungen, Systemmonitore, Quick Launcher oder Account-Wechsel sowie Benachrichtigungsindikatoren.
Da man die Controls und den Stil der eigenen App unverändert übernehmen und in die Taskleiste bringen kann, halte ich das für nahezu die einzige .NET-Bibliothek, mit der sich unter Windows 11 nach dem Wegfall der Deskbands eine solche Erfahrung umsetzen lässt.
Linksammlung
- Deskband11Lib (Bibliothek)
- NuGet (WinUI)
- NuGet (WPF)
- BarPlay (Proof of Concept, Store)
- BarPlay (Quellcode)
- Ursprüngliche Inspiration (zadjii/Deskband11)
Es steht unter der MIT-Lizenz, und man kann mit einer Kopie der Beispielprojekte (Deskband11Lib.WinUI.Sample, Deskband11Lib.Wpf.Sample) direkt loslegen. Feedback, Issues und PRs sind alle willkommen. Wenn jemand ein interessantes Taskleisten-Widget baut, lasst es mich wissen.
2 Kommentare
Oh, die Idee ist wirklich gut.
Vielen Dank! Eigentlich habe ich es nur als Bibliothek umgesetzt, und ich denke, das ist der Idee der Person zu verdanken, die es ursprünglich gemacht hat .. haha