2 points par kck4156 5 시간 전 | 2 commentaires | Partager sur WhatsApp

J’ai récemment publié une bibliothèque qui permet d’insérer directement l’UI d’une application dans la barre des tâches de Windows 11. Elle s’appelle Deskband11Lib et, une fois installée via NuGet, elle permet de transformer une app WinUI 3 ou WPF en widget de barre des tâches.

Je vais expliquer pourquoi je l’ai créée, comment elle fonctionne, puis montrer le widget PoC que j’ai effectivement publié sur le Store.


Contexte : les deskbands disparus dans Windows 11

Jusqu’à Windows 10, il existait une fonctionnalité Deskbands qui permettait d’afficher de petites barres d’outils dans la barre des tâches. Avec le passage à Windows 11, cette fonctionnalité a complètement disparu. Pour ceux qui aimaient avoir dans la barre des tâches de « petits widgets toujours visibles » comme des contrôles multimédia, un moniteur système ou un lanceur rapide, ce changement a été assez regrettable.

Inspiration : zadjii’s Deskband11

J’ai vu il y a peu zadjii/Deskband11 sur GitHub, et l’approche centrale m’a vraiment impressionné.

Poser une fenêtre WinUI 3 transparente au-dessus de la barre des tâches, faire de cette fenêtre un HWND enfant de la barre des tâches via SetParent, puis définir une zone de découpe adaptée à la taille du contenu pour donner l’impression qu’elle fait partie de la barre des tâches.

Au final, ce n’est « qu’une fenêtre flottant au-dessus de la barre des tâches », mais l’idée était vraiment ingénieuse. Cela dit, le projet d’origine se présentait lui-même comme du « code de niveau hackathon », et il lui manquait certains éléments pour être réutilisable dans un vrai produit.

Je l’ai donc transformé en bibliothèque

Comme l’idée était trop bonne pour être perdue, je l’ai réécrite sous forme de bibliothèque afin que n’importe qui puisse l’utiliser avec un simple dotnet add package.

L’utilisation est simple

Il suffit de créer une fenêtre WinUI 3 et de la passer à TaskbarContentHost.

var window = new MainWindow();  
var host = new TaskbarContentHost(window, rootElement, new TaskbarContentHostOptions  
{  
    PreferredWidth = 360,  
    PreferredHeight = 48  
});  
  
await host.AttachWhenLayoutReadyAsync();  
window.Activate();  

Pour WPF, l’API est presque identique. La bibliothèque gère automatiquement la détection de l’alignement de la barre des tâches (gauche/centre), l’évitement des chevauchements avec le bouton Démarrer et la zone de notification, la restauration après redémarrage d’Explorer, ainsi que les animations lors des changements de disposition.


Il a fallu pas mal de temps pour la faire fonctionner correctement

Quand j’ai essayé d’exécuter le code d’origine tel quel, il se lançait bien, mais la position et la taille de la fenêtre étaient complètement erronées. Comme le code initial avait été écrit dans un contexte de hackathon, je ne savais pas au départ si le problème venait des changements d’implémentation de la barre des tâches au fil des mises à jour de Windows 11, ou si le code d’origine était déjà bancal. Les deux étaient possibles, donc je n’ai eu d’autre choix que d’examiner un à un les éléments liés à la barre des tâches pour vérifier directement comment tout se comportait sur les builds actuels. En plus, le projet d’origine ne prenait absolument pas en compte des cas comme le bouton Démarrer centré ou des éléments tels que le bouton Widgets, ce qu’il a fallu traiter lors de la transformation en bibliothèque.

J’ai donc seulement repris du projet d’origine la manière d’utiliser UI Automation et quelques API Win32 pour déterminer la taille et la position des fenêtres, puis j’ai réécrit de zéro toute la logique de calcul de l’espace libre. Il fallait récupérer la position du bouton Démarrer, du groupe de boutons d’applications de la barre des tâches, du bouton Widgets et de la zone de notification afin de calculer l’espace restant. Et selon que l’alignement de la barre des tâches est à gauche ou au centre, la zone disponible n’apparaît pas au même endroit, ce qu’il a aussi fallu prendre en compte.


J’ai réellement créé une app et je l’ai publiée sur le Store : BarPlay

Pour vérifier que la bibliothèque était vraiment exploitable, j’ai créé une application avec et je l’ai publiée sur le Microsoft Store. Elle s’appelle BarPlay.

C’est un widget qui affiche dans la barre des tâches la miniature, le titre et les contrôles du média en cours de lecture. Il fonctionne avec toutes les applications prenant en charge les Windows System Media Transport Controls (SMTC), comme Spotify, les navigateurs ou les apps YouTube PWA. Je l’ai compilé avec NativeAOT pour minimiser le temps de démarrage et l’utilisation des ressources.

Lien de l’app Microsoft Store

Je l’ai d’abord montré à quelques proches autour de moi, et les retours ont été très positifs.


À quoi cela peut servir

Cela permet de placer dans un emplacement toujours visible, sans ouvrir de fenêtre séparée, du contenu créé avec WinUI 3 ou WPF. On peut imaginer des usages comme un minuteur, des contrôles de lecture multimédia (comme BarPlay), l’état des builds ou des notifications CI, un moniteur système, un lanceur rapide, un sélecteur de compte ou encore un indicateur de notifications.

Comme on peut reprendre tels quels les contrôles et le style de sa propre application pour les afficher dans la barre des tâches, je pense qu’il s’agit de l’une des très rares bibliothèques .NET — voire la seule — permettant de recréer ce type d’expérience sur Windows 11 depuis la disparition des deskbands.


Liens

Le projet est sous licence MIT, et vous pouvez démarrer en copiant les projets d’exemple (Deskband11Lib.WinUI.Sample, Deskband11Lib.Wpf.Sample). Les retours, issues et PR sont les bienvenus. Et si vous créez un widget de barre des tâches intéressant, faites-le moi savoir.

2 commentaires

 
turtlehwan 4 시간 전

Oh, l’idée est vraiment bonne.

 
kck4156 4 시간 전

Merci ! En fait, je n’ai fait que le transformer en bibliothèque ; je pense que c’est surtout grâce à l’idée de la personne qui l’avait créé au départ.. haha