[WinForm] Afficher le ContextMenuStrip sur click gauche d’un NotifyIcon

Publié le 07 septembre 2009 par Jeremy.jeanson

Voici un petit bout de code que je voulais partagé depuis longtemps, je profites donc du fait d’avoir eut à l’utiliser dernièrement pour le sortir des oubliettes.

Celui-ci sert à pouvoir afficher un menu contextuel de type ContextMenuStrip sur lors d’un click gauche sur un NotifyIcon. Les personnes qui on tenté l’expérience se sont certainement rendu compte que celà était beaucoup moins évidant qu’il pouvait y parêtre:

- Positionnement du menu qui n’est pas bon.

- Parent qui n’hérite pas de control.

- Menu qui ne se ferme pas après être ouvert.

Voila pourquoi il y a quelque années, à l’arrivé de .net 2 et des ToolStrip (args ca fait mal au moral) j’était tombé sur une personne qui indiquait que la méthode qui affichait le menu contextuel était ne fait ShowContextMenu, mais qu’elle n’était pas accessible directement. D’où l’idée à l’époque du code suivant qui invoque la méthode via reflection.

Vb

Private Sub NotifyIcon_MouseClick(ByVal sender As Object, ByVal e As MouseEventArgs)
    ' Test le click left
    If e.Button = MouseButtons.Left Then
        ' Récupération de la méthode private ShowContextMenu du NotifyIcon
        monNotifyIcon.GetType() _
              .GetMethod( _
                  "ShowContextMenu", _
                  System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic) _
              .Invoke(monNotifyIcon, Nothing);
    End If
End Sub

C#

private void NotifyIcon_MouseClick(Object sender, MouseEventArgs e)
{
    // Test le click left
    if (e.Button == MouseButtons.Left)
    {
        // Récupération de la méthode private ShowContextMenu du NotifyIcon
        monNotifyIcon.GetType()
              .GetMethod(
                  "ShowContextMenu",
                  System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)
              .Invoke(monNotifyIcon, null);
    }
}