Question Invoquer le menu contextuel de NotifyIcon


Je veux l'avoir de telle sorte que cliquer avec le bouton gauche de la souris sur NotifyIcon entraîne également l'ouverture du menu contextuel (défini avec la propriété ContextMenuStrip). Comment pourrais-je y arriver? Dois-je gérer Click et trouver le positionnement moi-même?
Edit: l'affichage du menu avec les résultats trayIcon.ContextMenuStrip.Show () est un comportement indésirable:

Le menu ne s'affiche pas au même endroit que si vous cliquiez avec le bouton droit sur NotifyIcon (il semble que vous ne puissiez pas définir les coordonnées x et y sur l'emplacement de la barre des tâches, du moins sur Windows 7). Il apparaîtra au-dessus de la barre des tâches (pas une grosse affaire, mais la cohérence serait bien).

Lorsque le menu est affiché, une icône supplémentaire est ajoutée à la barre des tâches.

Cliquer ailleurs que sur le menu ne le ferme pas (alors que si vous cliquez avec le bouton droit de la souris pour faire apparaître le menu contextuel en cliquant sur Autre, cela ferme automatiquement le menu contextuel).

Est-il possible d'invoquer simplement le menu mais le gestionnaire de clic droit intégré le fait?


37
2018-02-05 16:37


origine


Réponses:


Vous devez normalement gérer l'événement MouseClick pour détecter le clic et appeler la méthode ContextMenuStrip.Show ():

    private void notifyIcon1_MouseClick(object sender, MouseEventArgs e) {
        contextMenuStrip1.Show(Control.MousePosition);
    }

Mais cela ne fonctionne pas correctement, le CMS ne se fermera pas lorsque vous cliquerez en dehors de celui-ci. Le problème sous-jacent est une quirk de Windows (aka "bug") décrite dans cet article de la KB.

Invoquer cette solution de contournement dans votre propre code est assez pénible, le pinvoke est désagréable. La classe NotifyIcon a cette solution de contournement dans son Méthode ShowContextMenu (), ils ont juste rendu la tâche difficile, car c'est une méthode privée. La réflexion peut contourner cette restriction. J'ai découvert ce piratage il y a 5 ans et personne n'a encore signalé de problème. Définissez la propriété ContextMenuStrip du NFI et implémentez l'événement MouseUp comme ceci:

using System.Reflection;
...
    private void notifyIcon1_MouseUp(object sender, MouseEventArgs e) {
      if (e.Button == MouseButtons.Left) {
        MethodInfo mi = typeof(NotifyIcon).GetMethod("ShowContextMenu", BindingFlags.Instance | BindingFlags.NonPublic);
        mi.Invoke(notifyIcon1, null);
      }
    }

83
2018-02-05 17:07



Si vous gérez MouseUp plutôt que Click, vous pourrez déterminer quel bouton a été cliqué, ainsi que le bouton emplacement du clic. Vous pouvez utiliser cet emplacement comme emplacement pour afficher le ContextMenu.

notifyIcon.MouseUp += new MouseEventHandler(delegate(object sender, MouseEventArgs e) { contextMenu.Show(e.Location); });

2
2018-02-05 17:03



Vous pouvez connecter un événement onClick pour l'icône de notification, puis afficher l'appel dans le clic sur

private void wire()
{
     notifyIcon1.Click += new EventHandler(notifyIcon1_Click);
}

void notifyIcon1_Click(object sender, EventArgs e)
 {
    contextMenuStrip1.Show(Cursor.Position);
 }

2
2018-02-05 17:02



utilisez le code suivant pour afficher le menu contextuel à droite et à gauche, cliquez sur notifyicon, si vous trouvez un problème, envoyez-moi un message à arshad_mcs786@hotmail.com (arshad de Islamabd)
//System.Runtime.InteropServices utilise thi comme référence

    [DllImport("User32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
    public static extern bool SetForegroundWindow(HandleRef hWnd);

    private void notifyIcon1_Click(object sender, EventArgs e)
    {
        SetForegroundWindow(new HandleRef(this, this.Handle));
        int x = Control.MousePosition.X;
        int y = Control.MousePosition.Y;
         x = x - 10;
        y = y - 40;
        this.contextMenuStrip1.Show(x,y );
        //this.PointToClient(Cursor.Position)
    }

2
2017-10-30 05:33