2 Punkte von kck4156 5 시간 전 | 2 Kommentare | Auf WhatsApp teilen

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 SetParent als 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.

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.

Microsoft Store App-Link

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

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

 
turtlehwan 4 시간 전

Oh, die Idee ist wirklich gut.

 
kck4156 4 시간 전

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