2010-03-19 3 views
1

J'essaie d'afficher un menu contextuel lorsque je clique sur un NotifyIcon. Il suffit d'appeler NotifyIcon.ContextMenuStrip.Show() ne fonctionne pas très bien. A solution has been posted here before qui appelle une méthode secrète utilisant la réflexion:Afficher le menu contextuel NotifyIcon et contrôler sa position?

Dim mi As System.Reflection.MethodInfo = GetType(NotifyIcon).GetMethod("ShowContextMenu", Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic) 
mi.Invoke(Icon, Nothing) 

Cela fonctionne très bien, sauf que je dois aussi contrôler le menu est affiché. Je veux attendre que le SystemInformation.DoubleClickTime se soit écoulé entre la réception de l'événement NotifyIcon.MouseUp et l'affichage du menu, de sorte que je puisse gérer les simples clics et les doubles-clics séparément. Mais l'appel de la méthode ShowContextMenu affiche le menu à la position actuelle de la souris lorsque ShowContextMenu est appelé, et non lorsque l'icône a été cliquée. Ce qui signifie que si la souris est déplacée pendant le DoubleClickTime, le menu sera affiché dans une partie différente de l'écran. Donc, si je peux contrôler où le menu est affiché, je peux simplement enregistrer les coordonnées de la souris lorsque je reçois l'événement MouseUp, puis je peux m'assurer que le menu est affiché près de l'icône. Y a-t-il un moyen de faire cela?

Merci d'avance.

Répondre

0

Eh bien, je viens de découvrir qu'il existe des programmes qui présentent ce même comportement. J'ai juste parcouru toutes les icônes de ma barre d'état système et environ la moitié d'entre eux le font. Si vous cliquez avec le bouton gauche de la souris sur l'icône, puis déplacez la souris pendant le délai avant que le menu n'apparaisse, le menu apparaîtra à l'emplacement de la dernière souris, où que ce soit sur l'écran. Snagit est une application qui fait cela. Outlook est le seul programme dans mon bac qui affiche toujours le menu où j'ai cliqué sur l'icône. Mais Snagit semble utiliser un .NET ContextMenuStrip, alors qu'Outlook utilise probablement un menu natif.

Donc soit ce comportement est standard, soit c'est un problème que personne d'autre n'a réussi à résoudre non plus. Et en tant qu'utilisateur, je n'ai jamais remarqué ce comportement jusqu'à hier quand je testais ma propre application. Donc je suppose que ce n'est pas un gros problème et je ne m'en soucierai pas.

Questions connexes