NotifyIcon ContextMenu et trop d’événements de clic

J’utilise la classe NotifyIcon pour afficher une icône dans la barre des tâches. L’icône remplit 2 fonctions: lorsque l’utilisateur clique avec le bouton de gauche, il doit afficher une fenêtre. Lorsque l’utilisateur clique avec le bouton de droite, il doit afficher le menu contextuel. Cela fonctionne très bien sauf que la fenêtre est affichée après que l’utilisateur a cliqué sur une option du menu contextuel. Voici mon code:

 contextMenuItems = new List(); contextMenuItems.Add(new MenuItem("Function A", new EventHandler(a_Clicked))); contextMenuItems.Add(new MenuItem("-")); contextMenuItems.Add(new MenuItem("Function B", new EventHandler(b_Clicked))); trayIcon = new System.Windows.Forms.NotifyIcon(); trayIcon.MouseClick += new MouseEventHandler(trayIcon_IconClicked); trayIcon.Icon = new Icon(GetType(), "Icon.ico"); trayIcon.ContextMenu = contextMenu; trayIcon.Visible = true; 

Le problème est que mon événement trayIcon_IconClicked est déclenché lorsque l’utilisateur sélectionne “Fonction A” ou “Fonction B”. Pourquoi cela arriverait-il?

Merci j

En affectant le menu contextuel au contrôle NotifyIcon, il capture automatiquement le clic droit et y ouvre le menu contextuel atsortingbué. Si vous souhaitez effectuer une logique avant d’afficher le menu contextuel, affectez un délégué à l’événement contextMenu.Popup.

 ... contextMenu.Popup += new EventHandler(contextMenu_Popup); ... private void trayIcon_IconClicked(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { //Do something here. } /* Only do this if you're not setting the trayIcon.ContextMenu property, otherwise use the contextMenu.Popup event. else if(e.Button == MouseButtons.Right) { //Show uses assigned controls Client location to set position, //so must go from screen to client coords. contextMenu.Show(this, this.PointToClient(Cursor.Position)); } */ } private void contextMenu_Popup(object sender, EventArgs e) { //Do something before showing the context menu. } 

Je suppose que la fenêtre s’ouvre, c’est que le menu contextuel que vous ouvrez utilise NotifyIcon comme contrôle cible. Ainsi, lorsque vous cliquez dessus, le gestionnaire de clics que vous avez atsortingbué à NotifyIcon est exécuté.

Modifier: une autre option à envisager consiste à utiliser ContextMenuSsortingp à la place. NotifyIcon a également une propriété ContextMenuSsortingp, et il semble y avoir beaucoup plus de fonctionnalités qui lui sont associées (j’ai remarqué que je pourrais faire plus, de manière programmable). Peut-être voudriez-vous tenter cela si les choses ne fonctionnent pas bien pour une raison quelconque.

J’ai rencontré le même problème. Modifier le ContextMenu du NotifyIcon en ContextMenuSsortingp ne résout pas le problème (en fait, lorsque j’ai changé le ContextMenu, l’événement Click se produisait lorsque ContextMenuSsortingp était affiché au lieu de lorsque l’utilisateur avait cliqué sur l’un des éléments.

Ma solution au problème consiste à modifier l’événement que j’ai utilisé pour afficher le menu contextuel du clic gauche. Au lieu d’utiliser le gestionnaire d’événements Click, j’utilise MouseUp et je vérifie quel MouseButton a cliqué.

Construction de NotifyIcon (notifyContext est un System.Windows.Forms.ContextMenuSsortingp)

 m_notifyIcon.MouseUp += new Forms.MouseEventHandler(m_notifyIcon_MouseUp); m_notifyIcon.ContextMenuSsortingp = notifyContext; Handling the left click event and show the main contextmenu: void m_notifyIcon_MouseUp(object sender, Forms.MouseEventArgs e) { if (e.Button == Forms.MouseButtons.Left) { mainContext.IsOpen = ! mainContext.IsOpen; } }