NotifyIcon reste dans le bac même après la fermeture de l'application mais disparaît sur la souris

il y a beaucoup de questions sur le fait de poser le même doute. La Solution pour cela est de mettre

notifyIcon.icon = null et appelant Dispose pour lui dans FormClosing event.

dans ma demande, il n'y a pas de tel formulaire, mais a l'icône de Notification qui met à jour sur les événements. Sur la création, je cache ma forme et faire ShowInTaskbar propriété false . Par conséquent, je ne peux pas avoir d'événements "FormClosing" ou "FormClosed".

si cette application obtient de l'événement pour sortir, Il s'appelle Process.GetCurrentProcess().Kill(); pour quitter.

j'ai ajouté notifyIcon.icon = null ainsi que disposer avant de tuer, mais toujours icône reste taskbar jusqu'à ce que je passe la souris dessus.

EDIT : si je suppose que ce comportement est dû à l'appel GetCurrentProcess().Kill() , y a-t-il un moyen élégant de sortir de l'application qui va effacer toutes les ressources et supprimer l'icône du plateau de système.

53
demandé sur Swanand 2013-02-06 11:36:07

12 réponses

vous pouvez définir

notifyIcon1.Visible = false;

ou

notifyIcon.Icon = null;

dans l'événement de clôture de la forme.

44
répondu Jason Dias 2013-05-24 19:03:54

la seule solution qui a fonctionné pour moi était d'utiliser L'événement fermé et cacher et disposer de l'icône.

icon.BalloonTipClosed += (sender, e) => { 
                                            var thisIcon = (NotifyIcon)sender;
                                            thisIcon.Visible = false;
                                            thisIcon.Dispose(); 
                                        };
12
répondu The Muffin Man 2016-05-25 18:17:48

utiliser notifyIcon.Visible = False dans FormClosing événement

7
répondu Ismael 2018-03-06 05:41:29

j'ai essayé ce code. Je pense que c'est plus facile. Je vais l'écrire pour plusieurs outils ou événements. J'espère que ce sera utile pour vous.

utilisez ce code lorsque vous voulez le faire lorsque vous appuyez sur le bouton Quitter ou fermer:

    private void ExitButton_Click(object sender, EventArgs e)
    {
            notifyIcon.Dispose;
            Application.Exit();        //   or   this.Close();
    }

utilisez ce code lorsque vous voulez le faire lorsque le formulaire se ferme:

    private void Form1_FormClosing(object sender, EventArgs e)
    {
            notifyIcon.Dispose;
            Application.Exit();        //   or   this.Close();
    }

le code important est celui-ci:

    notifyIcon.Dispose;
5
répondu Pouya 2015-05-30 10:09:21

c'est un comportement normal, malheureusement; il est dû à la façon dont Windows fonctionne. Vous pouvez r vraiment faire quelque chose à ce sujet.

Voir Problème avec NotifyIcon pas dissappearing sur Winforms App pour des suggestions, mais aucun d'eux n'a jamais fonctionné pour moi.

Voir Aussi icône de notification reste dans le plateau de système sur L'application Fermer

Microsoft ont marqué ce que "ne sera pas fixer" sur Microsoft Connecter.

2
répondu Matthew Watson 2017-05-23 12:18:06

Je ne pense pas que la WPF ait sa propre notification, n'est-ce pas? Si vous utilisez le Harcodet tiers.Wpf.TaskbarNotification, puis essayer ceci:

afin d'empêcher mon application de se fermer lorsque la fenêtre est fermée (exécuter en arrière-plan), j'ai séparé la logique de fermeture de la fenêtre (appuyer sur le bouton x en haut à droite) et de la fermer (à travers le menu contextuel). Pour que cela fonctionne, faites de votre menu contextuel _isExplicitClose un menu true. Sinon, il va tout simplement masquer la fenêtre et continuer à exécuter.

ce n'est explicite à proximité, cacher l'icône et la forme avant la fermeture. De cette façon, l'icône ne traîne pas après l'arrêt de l'application.

private bool _isExplicitClose;
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
    base.OnClosing(e);

    if (!_isExplicitClose)
    {
        e.Cancel = true;
        Hide();
    }
}

protected void QuitService(object sender, RoutedEventArgs e)
{
   _isExplicitClose = true;
   TaskbarIcon.Visibility = Visibility.Hidden;
   Close();
}
2
répondu Sinaesthetic 2014-03-22 23:51:50

les composants doivent juste être éliminés dans l'ordre approprié comme ceci:

NotifyIcon.Icon.Dispose();

NotifyIcon.Dispose();

ajoutez ceci à l'événement de clôture MainWindow .

Espérons que cela aidera.

2
répondu Shim-Sao 2017-11-21 13:46:50

je peux dire que vous pouvez résoudre le problème tout simplement en utilisant le .méthode dispose (), mais qui n'est pas appelée si vous tuez le processus au lieu de quitter l'application.

veuillez vous référer à la demande .Exit si vous avez construit une application de formulaire de Windows simple autrement se référer à environnement.Sortie c'est plus général.

1
répondu Lanello 2014-02-12 18:00:34

Essayer Application.DoEvents(); après le réglage de notifyIcon.Icon à null et l'élimination:

notifyIcon.Icon = null;
notifyIcon.Dispose();
Application.DoEvents();

et considérer Environment.Exit(0); au lieu de Process.GetCurrentProcess().Kill() .

1
répondu Cubinator73 2015-02-14 00:59:59

j'ai eu exactement le même problème que vous.

la bonne façon est d'envoyer un message WM_CLOSE à un processus.

J'utilise le code c que j'ai trouvé dans cet article.

http://social.msdn.microsoft.com/Forums/vstudio/en-US/82992842-80eb-43c8-a9e6-0a6a1d19b00f/terminating-a-process-in-a-friendly-way

0
répondu victor 2013-06-28 08:10:37

La bonne réponse a déjà été donnée. Mais vous devez également fournir un délai, par exemple avec une minuterie. Alors seulement, l'application peut toujours supprimer l'icône en arrière-plan.

private System.Windows.Forms.Timer mCloseAppTimer;
private void ExitButton_Click(object sender, EventArgs e) 
{ 
    notifyIcon.Visible = false; notifyIcon.Dispose; 
    mCloseAppTimer = new System.Windows.Forms.Timer(); 
    mCloseAppTimer.Interval = 100; 
    mCloseAppTimer.Tick += new EventHandler(OnCloseAppTimerTick); 
} 
private void OnCloseAppTimerTick(object sender, EventArgs e) 
{ 
    Environment.Exit(0); // other exit codes are also possible 
}
0
répondu Michael Petöfalvi 2017-04-12 10:17:58

modifier les codes de ...Designer.cs-dessous de codage.

        protected override void Dispose(bool disposing)
           {
           if (disposing )
               {
               this.notifyicon.Dispose();
               }
           base.Dispose(disposing);
           }
0
répondu Can DOGRU 2017-08-29 14:22:08