2010-12-06 56 views
6

Mon application est conçue pour s'asseoir dans la zone de notification et se comporter de la même manière que les éléments de la barre réseau/volume/alimentation/centre d'action de Windows 7 (et les éléments équivalents de Windows Vista). En d'autres termes, il devient visible lorsque l'icône de la barre d'état est cliquée et devient masquée lorsque la mise au point est perdue.Détermination de l'emplacement de l'icône de la barre

L'application est écrite en WPF, mais j'utilise actuellement NotifyIcon de WinForms pour l'icône de la barre d'état système.

Je voudrais savoir si quelqu'un a des suggestions sur la façon dont je pourrais déterminer la position (c'est-à-dire les coordonnées de l'écran) de l'icône de la barre d'état de mon application. Les éléments de la barre d'état système Windows Vista/7 par défaut ont une certaine façon de procéder, car les fenêtres contextuelles sont alignées au centre au-dessus de l'icône de la barre d'état.

Dans Vista ce n'était pas vraiment un problème: j'avais l'application en permanence dans le coin en bas à droite, et cela semblait bien (même si il n'y avait pas de logique pour les cas où la barre des tâches n'a pas été placée au en bas de l'écran). Cependant, dans Windows 7 mon application finit par obscurcir la nouvelle boîte pop-out de la barre d'état système, plutôt que de planer au-dessus comme les commandes de volume, etc.

La meilleure solution que j'ai vu dans mes recherches jusqu'à présent est de gérer l'événement mouse-up sur le NotifyIcon et d'utiliser les coordonnées de la souris pour déterminer la position de l'icône. Je pense que je vais finir par utiliser cette méthode si à moins que quelqu'un ait une meilleure idée, bien que ce ne soit pas idéal car la position variera légèrement en fonction de l'endroit où l'utilisateur clique sur l'icône.

Répondre

6

Windows 7 et supérieur expose la fonction Shell_NotifyIconGetRect(), qui renvoie les coordonnées d'écran du rectangle englobant de l'icône.

Toutefois, vous devrez lui fournir le GUID de l'icône de notification, et je ne sais pas si vous pouvez accéder à cette propriété via la classe NotifyIcon gérée.

+0

Merci beaucoup :) Je vais voir si je peux l'obtenir travailler avec NotifyIcon et faire un rapport. – Quppa

+6

J'ai la fonction Shell_NotifyIconGetRect() qui fonctionne avec la classe WinForms NotifyIcon. J'ai documenté le processus dans un article de blog ici: http://blog.quppa.net/?p=17 – Quppa

4

Suite à cela, je l'ai écrit sur une méthode pour trouver l'emplacement d'une icône Notify lorsque la fonction Shell_NotifyIconGetRect n'est pas disponible: http://blog.quppa.net/2010/12/28/windows-7-style-notification-area-applications-in-wpf-part-6-notify-icon-position-pre-windows-7/

+0

Merci. Est-ce que celui-ci ne fonctionne que sur les Windows plus anciens? Je veux dire, ça marche sur des versions plus récentes (Win 7,8)? – Jet

+0

Je recommande fortement d'utiliser la fonction Shell_NotifyIconGetRect dans Windows 7 et versions ultérieures, mais la méthode que j'ai décrite ici devrait fonctionner dans les versions plus récentes de Windows. Cependant, il ne trouvera pas l'emplacement dans la fenêtre contextuelle. – Quppa