Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Thomas Lebrun

Tout sur WPF, LINQ, C# et .NET en général !

Actualités

[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 Smile

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:

image

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:

image

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:

image

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:

image

 

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:

image image

Pour personnaliser la JumpList de votre application, il est nécessaire de travailler avec un objet de type JumpListManager:

image

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:

image

Ensuite, il est possible d’ajouter des éléments dans les catégories Task, Frequent ou bien de définir vos propres catégories:

image

image

image

Attention, toute modification de la JumpList requiert un appel à la méthode Refresh pour que celle-ci soit rafraichie avec les dernières informations:

image

Une fois cet appel effectué, il ne reste plus qu’à lancer l’application pour observer le résultat:

image

 

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:

image

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:

image

 

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:

image

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:

image

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:

image

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é:

image  

 

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:

 image

Ensuite, il ne vous reste plus qu’à vous abonner aux évènements PeekRequested et ThumbnailRequested:

image

Lorsque ce code est exécuté, la miniature de l’application est personnalisé selon vos souhaits:

image

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):

image

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:

image

 

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:

image

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:

image

image

L’appel à cette méthode entraine bien la création d’une miniature personnalisée:

image

 

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é:

image

Le résultat en image:

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:

image

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:

image image

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:

image

Lorsque ce code est exécuté, via un simple appel de méthode:

image

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:

image

 

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 Wink

 

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 :
Posted: jeudi 19 mars 2009 10:27 par Thomas LEBRUN
Classé sous : , ,

Commentaires

NeuroCypher a dit :

super post.

# mars 19, 2009 10:27

sebmafate a dit :

Merci...

et maintenant, je fais quoi avec mon article :p

# mars 19, 2009 11:46

tomlev a dit :

Super post ! Ca aurait pu faire un article complet sur DVP ;)

Par contre, c'est dommage qu'on doive encore et toujours passer par des API Shell natives :S. A quand une vraie API Windows en .NET ? Je suppose qu'il faudra attendre Midori...

Pour ceux qui se poseraient la question, la sample library mentionnée par Thomas est ici :

http://code.msdn.microsoft.com/Windows7Taskbar

# mars 19, 2009 12:24

Erebuss a dit :

Un truc dans ce genre là  ?

IntPtr hwnd = new  WindowInteropHelper(Application.Current.MainWindow).Handle;

^^

En tout cas, vraiment sympa ton article.

Chapeau :)

# mars 19, 2009 13:41

Thomas LEBRUN a dit :

@Erebuss: Oui, c'est exactement ça :)

@tomlev: Disons qu'au début, j'avais pas prévu de faire aussi long mais oui, ca pourrait faire un bel article Dvp (si je trouve le temps, pkoi pas le "migrer" ;)

# mars 19, 2009 14:45

teddyalbina a dit :

Pas mal. Il me plait bien ce 7

# mars 19, 2009 16:50

azra a dit :

C'est quoi DVP?

# mars 19, 2009 17:42

jmix90 a dit :

Bjr, je débute en WPF mais je pensais que l'on pouvait récuper le handle d'une fenêtre avec un code de ce type :

(PresentationSource.FromVisual(this) as HwndSource) .Handle;

Je me trompe ?

# mars 19, 2009 18:22

Thomas LEBRUN a dit :

Cela semble être une autre technique que je ne connaissaie pas.

La première fonctionne, je tâcherais de voir celle-ci à l'occasion ;)

Merci

# mars 19, 2009 19:35
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01