Utilisation du contrôle NotifyIcon en C# WinForms

[I] Connaissances de base

Les icônes dans la barre des tâches sont des raccourcis vers des processus s'exécutant en arrière-plan sur l'ordinateur, tels que les programmes antivirus ou le contrôle du volume. Lorsque nous utilisons des applicasions comme QQ, l'interface principale peut être masquée dans la zone de notification et réapparaitre lorsqu'on clique dessus, ce qui est très pratique.

En C#, comment pouvons-nous implémenter cette fonctionnalité ? C'est précisément le rôle du contrôle NotifyIcon. Vous vous demanderez peut-être comment implémenter le menu contextuel qui apparaît lors d'un clic droit sur l'icône dans la zone de notification.

C'est en fait le rôle du contrôle ContextMenuStrip. Lorsqu'un ami vous envoie un message et que l'icône de l'ami dans la zone de notification clignote, cela est obtenu en alternant l'affichage et le masquage de l'image. Le contrôle Timer est utilisé pour contrôler les temps d'affichage. C'est une technique intéressante que le contrôle NotifyIcon permet d'implémenter. La propriété Icon définit l'icône affichée dans la zone de notification. Le menu contextuel de l'icône est déterminé par la propriété ContextMenu. La propriété Text attribue un texte d'info-bulle. Pour afficher l'icône dans la zone de notification, la propriété Visible doit être définie sur true.

[I] Analysons d'abord les propriétés et méthodes de base du contrôle NotifyIcon :

BalloonTipIcon — Type de l'info-bulle (None/Aucun, Info/point d'exclamation bleu, Warning/point d'exclamation jaune, Error/croix rouge) ; BalloonTipText — Contenu de l'info-bulle ; BalloonTipTitle — Titre de l'info-bulle ; ContextMenuStrip — Menu contextuel associé ; Icon — Icône affichée ; Text — Texte d'info-bulle lorsque la souris passe sur l'icône ; Visible — Définit si l'icône est visible.

[Étapes d'implémentation :]

Première étape : Créez un nouveau projet Form1 et modifiez sa propriété Text avec le nom de votre projet ;

Deuxième étape : Ajoutez un contrôle NotifyIcon à la fenêtre Form1, modifiez sa propriété Name en MyNotifyIcon. Modifiez sa propriété Text pour qu'elle corresponde au titre de l'application. Lorsque NotifyIcon s'affiche dans la zone de notification, le texte de la propriété Text s'affiche comme info-bulle lorsque la souris passe sur l'icône du programme. Modifiez la propriété Icon pour ajouter une icône à NotifyIcon ;

Troisième étape : Dans la fenêtre des propriétés de Form1, sélectionnez également la même icône pour la propriété Icon. Modifiez la propriété ShowInTaskBar sur False pour que l'application n'apparaisse pas dans la barre des tâches lors de son exécution ;

Quatrième étape :

Ajoutez le code de gestion de l'événement DoubleClick pour NotifyIcon :

private void MyNotifyIcon_DoubleClick(object sender, EventArgs e)
{
    if(this.Visible)
    {
        this.Hide();
    }
    else
    {
        this.Show();
    }
}

Après tests pratiques, l'événement MouseDoubleClick semble fonctionner mieux.

// Double-clic sur l'icône de la zone de notification : rétablir l'affichage normal de la fenêtre
private void SystemTrayIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
    if (this.WindowState == FormWindowState.Minimized)
        this.WindowState = FormWindowState.Normal;
}

Cinquième étape :

Lors de l'utilisation du contrôle NotifyIcon, il est souvent nécessaire d'utiliser un menu contextuel (contrôle ContextMenu). Pour ce faire, ajoutez un contrôle ContextMenu à Form1, ajoutez deux éléments de menu : un pour ouvrir l'interface principale et un pour quitter. Dans la propriété ContextMenu de NotifyIcon, sélectionnez le contrôle ContextMenu que vous venez d'ajouter. Ainsi, vous pouvez exécuter diverses fonctionnalités de l'application via le menu contextuel de l'icône.

Sixième étape :

Le code pour l'élément de menu "Ouvrir l'interface principale" :

private void OuvrirInterfacePrincipale_Click(object sender, EventArgs e)
{
    if (this.Visible)
    {
        this.Hide();
    }
    else
    {
        this.Show();
    }
}

Septième étape :

private void QuitterApplication_Click(object sender, EventArgs e)
{
    this.Close();
}

// Événement Form1_SizeChanged : affiche l'icône de l'application et une info-bulle lors de la minimisation
private void Form1_SizeChanged(object sender, EventArgs e)
{
    if (WindowState == FormWindowState.Minimized)
    {
        this.Hide();
        this.SystemTrayIcon.Visible = true;
        this.SystemTrayIcon.ShowBalloonTip(30, "Information", "Bonjour, ceci est un exemple", ToolTipIcon.Info);
    }
}

Cela implémente les fonctionnalités décrites ci-dessus. Il faut souligner que :

this.SystemTrayIcon.ShowBalloonTip(30, "Information", "Bonjour, ceci est un exemple", ToolTipIcon.Info);

permet d'afficher une info-bulle, et que la condition WindowState == FormWindowState.Minimized vérifie si la fenêtre est minimisée, tandis que this.WindowState = FormWindowState.Normal; restaure la fenêtre.

[II] Exemple pratique

Implémenter la minimisation de la fenêtre vers la zone de notification avec C# NotifyIcon

  1. Définissez la propriété de la fenêtre ShowInTaskbar = false
  2. Ajoutez le contrôle NotifyIcon (nommé TrayIcon) et attribuez-lui une icône via sa propriété Icon.
  3. Ajoutez l'événement de minimisation de la fenêtre :
// Cette ligne doit être ajoutée dans la méthode InitializeComponent() de la fenêtre principale
// this.SizeChanged += new EventHandler(this.Form1_SizeChanged);

private void Form1_SizeChanged(object sender, EventArgs e) 
{
    if (this.WindowState == FormWindowState.Minimized) 
    {
        this.Hide(); 
        this.TrayIcon.Visible = true; 
    }
} 

Un autre événement peut également être utilisé :

// Contrôle de l'affichage de l'icône dans la barre des tâches lorsque la taille de la fenêtre change
private void Form1_Resize(object sender, EventArgs e)
{
    if (this.WindowState == FormWindowState.Minimized)
    {
        this.ShowInTaskbar = false;
    }
    else if (this.WindowState == FormWindowState.Normal || this.WindowState == FormWindowState.Maximized)
    {
        this.ShowInTaskbar = true;
    }
}

  1. Ajoutez l'événement de clic sur l'icône :
private void TrayIcon_Click(object sender, EventArgs e) 
{
    this.Visible = true;
    this.WindowState = FormWindowState.Normal;
    this.TrayIcon.Visible = false; 
}

  1. Vous pouvez ajouter un menu contextuel à NotifyIcon :

Faites glisser un contrôle ContextMenu (nommé MenuContextuel) sur la fenêtre principale, ajoutez des éléments de menu, puis dans la propriété ContextMenu de NotifyIcon, sélectionnez MenuContextuel comme menu contextuel.

[III] Exemple pratique : Afficher une info-bulle dans la zone de notification à partir du texte entré

Effet :

Analyse du code :

private void btnAfficher_Click(object sender, EventArgs e)
{
    string message = this.txtTexte.Text.Trim() == "" ? "Aucun texte !" : this.txtTexte.Text.Trim();
    this.TrayIcon.ShowBalloonTip(1000, "Information", message, ToolTipIcon.Info);
    // Paramètres : durée d'affichage, titre, texte, type d'icône
}

Détails du code complet :

Voir le code

Ajoutons maitnenant un exemple de boîte de notification inspirée de QQ :

Le code pour cette fenêtre est :

private static FenetreOutil Instance = null;

public static FenetreOutil GetInstance()  
{
    if (Instance == null)
        Instance = new FenetreOutil();
    
    return Instance;
}

Étiquettes: NotifyIcon WinForms C# SystemTray ContextMenu

Publié le 1 juillet à 20h58