[Seven] Travailler avec la Taskbar et le Shell de Windows Seven depuis vos applications .NET
Windows Seven, prochain système d’exploitation de Microsoft pour les postes clients, dispose d’une nouvelle barre des tâches (Taskbar) beaucoup plus évoluée que celle disponible dans Windows Vista:
- Possibilité de rajouter des entrées dans le menu contextuel
- Possibilité de customiser les miniatures qui apparaissent au survol de la souris
- Etc.
Il pourrait être intéressant de savoir comment manipuler cette barre des tâches (et les fonctionnalités qu’elle offre) au travers d’une application .NET.
Lorsque l’on regarde la documentation associée à la barre des tâches de Windows Seven, on se rend vite compte que toutes les fonctionnalités sont offertes grâce à des interfaces natives:
Ainsi, avec un peu d’intérop, on devrait être en mesure de faire un wrapper managé de ces interfaces. Et c’est ce que propose Microsoft au travers de la librairie Windows 7 Taskbar and Libraries .NET Interop Sample Library 
Le projet contient plusieurs projets (démos, wrappers, etc.) mais le plus important est sans aucun doute celui nommé Windows7.DesktopIntegration, qui définit tout le wrapper de la barre des tâches:
Une fois la référence ajoutée à votre projet de type WindowsForms, vous avez alors accès à toutes les manipulations possibles de la barre des tâches.
Affichage d’une barre de progression:
Vous pouvez faire afficher, dans l’icône de la barre des tâches de votre application, une barre de progression. Cela peut en effet s’avérer utile si un long traitement est en cours mais que l’application est réduite. Pour cela, il suffit d’utiliser le code suivant:
Comme vous pourrez le constater, beaucoup de méthodes d’interaction avec la barre des tâches sont développées sous la forme de méthodes d’extension:
A l’exécution, l’appel de la méthode permet d’afficher, sur l’icône dans la barre des tâches, une barre de progression:
Construire une “JumpList”:
Les JumpList sont les menus contextuels qui apparaissent après que vous ayez fait un clic droit sur l’une des icones située dans la barre des tâches. Ces listes peuvent être constituées de liens visités fréquement, de tâches ou bien de vos propres catégories:
Pour personnaliser la JumpList de votre application, il est nécessaire de travailler avec un objet de type JumpListManager:
Après l’avoir initialisé avec un appel à la méthode d’extension CreateJumpListManager, il est obligatoire de s’abonner à l’évènement UserremoveItems, qui est déclenché lorsqu’un utiliseur supprime un élément de la JumpList:
Ensuite, il est possible d’ajouter des éléments dans les catégories Task, Frequent ou bien de définir vos propres catégories:
Attention, toute modification de la JumpList requiert un appel à la méthode Refresh pour que celle-ci soit rafraichie avec les dernières informations:
Une fois cet appel effectué, il ne reste plus qu’à lancer l’application pour observer le résultat:
Ajouter une icône à l’image de la barre des tâches:
Chaque application située dans la barre des tâches dispose d’une image, qui permet de l’identifier rapidement. Avec Windows 7, il est également possible d’appliquer une icône à chacune de ces images.
Pour cela, il suffit une nouvelle fois de faire appel à la méthode d’extension nommée SetTaskbarOverlayIcon:
Lors de l’exécution de l’application, l’icone apparait correctement au dessus de l’image représentant l’application, dans la barre des tâches:
Ajouter des boutons aux miniatures de la barre des tâches:
Une autre des fonctionnalités offertes par la barre des tâches de Windows 7, c’est la possibilité d’avoir des buttons à l’intérieur des miniatures:
Le wrapper .NET mis à disposition par Microsoft propose une classe nommée ThumbButtonManager qui sert justement définir des boutons personnalisés au niveau des miniatures. Les objet de ce type doivent également être instanciés via un appel à la méthode d’extension CreateThumbButtonManager:
Ensuite, il suffit d’appeler la méthode CreateThumbButton pour créer un bouton. Bien sur, vous avez aussi la possibilité de vous abonner à l’évènement Clicked de ce bouton. C’est l’appel à la méthode AddThumbButtons qui vous permet d’insérer le bouton dans la miniature:
Lorsque l’application est en cours d’exécution, il suffit de passer la souris sur l’image qui est dans la barre des tâches pour voir apparaitre la miniature, avec les boutons que vous venez de définir. Notez tout de même que cette miniature n’apparait que si le thème Aero de Windows 7 est activé:
Personnaliser la miniature:
La miniature afficher par Windows 7 peut être personnalisée au moyen d’une classe nommée CustomWindowsManager qui est instanciée grâce à la méthode statique CreateWindowsManager:
Ensuite, il ne vous reste plus qu’à vous abonner aux évènements PeekRequested et ThumbnailRequested:
Lorsque ce code est exécuté, la miniature de l’application est personnalisé selon vos souhaits:
En ce qui concerne la miniature en elle-même, il ne s’agit que d’un simple Bitmap qui est généré via un appel à la méthode statique GrabWindowBitmap située dans la classe statique ScreenCapture (celle-ci se trouve dans le fichier CustomWindowManager.cs):
C’est d’ailleurs dans cette méthode que ce trouve le texte “Windows 7 Bridge” qui est affiché sur la miniature personnalisé, via un appel à la méthode DrawString:
Spécifier le contenu de la miniature (clipping):
Par défaut, la miniature qui apparait dans la barre des tâches représente votre application en entier. Une des nouveautés de Windows 7 est la possibilité de faire du “clipping” sur cette miniature et donc d’afficher une partie spécifique de votre application, en tant que miniature.
Voici l’image qui s’affiche, par exemple, lorsque la miniature de l’application est entière:
Cependant, grâce à un appel à la méthode SetThumbnailClip, il est possible de spécifier un objet de type Rectangle qui définira la partie de l’application à afficher dans la miniature:
L’appel à cette méthode entraine bien la création d’une miniature personnalisée:
Assigner l’infobulle de la miniature:
Cette fonctionnalité peut sembler être un gadget mais à bien y réfléchir, on se rend vite compte qu’elle apporte une certaine valeur ajoutée à votre application. Vous pouvez en effet, à tout moment, personnaliser l’infobulle qui apparait lorsque vous pointez votre souris sur l’icone de votre application, dans la barre des tâches.
Pour cela, un simple appel à la méthode d’extension SetThumbnailTooltip et le tour est joué:
Le résultat en image:
Manipuler le Shell:
Cette partie n’est pas spécifique à la barre des tâches mais concerne le système d’exploitation en lui-même. Vous avez la possibilité, au sein de votre application, de manipuler les bibliothèques de documents:
Il s’agit d’une nouvelle fonctionnalité de Windows 7 qui consiste à offrir aux utilisateurs la possibilité de créer des collections d’éléments qui sont en fait composées de liens vers des fichiers présents sur votre ordinateur. L’avantage, c’est que vous n’avez pas besoin de faire des copier/coller de fichiers dans un dossier: vous indiquez que les fichiers qui vous intéressent doivent se trouver dans la bibliothèque de documents que vous souhaitez et un simple clic sur le nom de cette bibliothèque de documents vous permet de visualiser tous les fichiers que vous y avez ajouté.
Pour manipuler les bibliothèques de documents, il est nécessaire de passer par la classe ShellLibrary. Celle-ci possède plusieurs méthodes statiques et non-statiques:
Le code suivant vous permet ainsi d’ajouter un répertoire (et son contenu) à la bibliothèque de documents spécifiée et de faire en sorte qu’il soit inséré dans la panneau de navigation:
Lorsque ce code est exécuté, via un simple appel de méthode:
On constate que le contenu du répertoire Images est bien ajouté à la bibilothèque de documents et que le nom est répertoire est bien inséré dans le Treeview de navigation:
Et WPF dans tout ça ?
Si vous avez fait attention au code que j’ai montré en images, vous avez sans doutes remarqué qu’il est (tout du moins celui lié à la barre des tâches) spécifique aux WindowsForms.
En effet, les wrappers développés pour le moment ne peuvent-être utilisés que dans des applications WindowsForms car toutes les méthodes d’extension reposent sur le Handle des fenêtres Windows, qui n’existent pas dans le cas des fenêtres WPF.
Fort heureusement, grâce à la classe WindowInteropHelper, il est possible de récupérer le Handle de ce type de fenêtre: j’ai donc commencer la création des méthodes d’extension qu’il serait possible d’utiliser dans un projet WPF et cela fonctionne plutôt bien dans l’ensemble: je posterais l’avancement de ce projet dès que possible. Bien sur, cela ne sera qu’une solution temporaire en attendant que Microsoft propose quelque chose de mieux 
J’espère que ce petit résumé vous sera utile !
A+
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :