87 votes

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

Il y a beaucoup de questions sur SO qui posent le même doute. La solution à ce problème est de définir

notifyIcon.icon = null et en appelant Dispose dans l'événement FormClosing.

Dans mon application, il n'y a pas de formulaire de ce type mais une icône de notification qui est mise à jour sur les événements. Lors de la création, je cache mon formulaire et je fais ShowInTaskbar propriété false . Je ne peux donc pas avoir d'événements "FormClosing" ou "FormClosed".

Si cette application reçoit un événement pour sortir, elle appelle Process.GetCurrentProcess().Kill(); pour sortir.

J'ai ajouté notifyIcon.icon = null ainsi que Dispose before killing, mais l'icône reste dans la barre des tâches jusqu'à ce que je passe la souris dessus.

EDIT : Si je suppose que ce comportement est dû au fait d'appeler GetCurrentProcess().Kill() Est-ce qu'il existe un moyen élégant de quitter l'application en vidant toutes les ressources et en supprimant l'icône de la barre d'état système ?

3voto

Matthew Watson Points 30804

Il s'agit malheureusement d'un comportement normal, dû à la façon dont Windows fonctionne. Vous ne pouvez pas vraiment y faire quelque chose.

Véase Problème avec NotifyIcon qui ne disparaît pas dans l'application Winforms pour quelques suggestions, mais aucune d'entre elles n'a jamais fonctionné pour moi.

Voir aussi L'icône de notification reste dans la barre d'état système à la fermeture de l'application

Microsoft a marqué ce problème comme "ne sera pas résolu" sur Microsoft Connect.

3voto

Rafael Points 31

La seule façon qui fonctionne pour moi était :

  1. Sur l'écran de conception, modification de la propriété notifyicon1 visible=false

  2. Insérez le code ci-dessous dans l'événement "activated" du formulaire principal :

    NotifyIcon1.Visible = True

  3. Insérez le code ci-dessous dans l'événement "closing" du formulaire principal :

    NotifyIcon1.Visible = false NotifyIcon1.Icon.Dispose() NotifyIcon1.Dispose()

2voto

Sinaesthetic Points 2693

Je ne pense pas que WPF ait sa propre NotifyIcon, n'est-ce pas ? Si vous utilisez la troisième partie Harcodet.Wpf.TaskbarNotification, alors essayez ceci :

Afin d'éviter que mon application ne se ferme lorsque la fenêtre est fermée (exécutée en arrière-plan), j'ai séparé la logique de fermeture de la fenêtre (en appuyant sur le bouton x en haut à droite) et la logique de fermeture effective (via le menu contextuel). Pour que cela fonctionne, faites en sorte que votre menu contextuel soit défini comme suit _isExplicitClose à vrai. Sinon, il va juste cacher la fenêtre et continuer à s'exécuter.

Cela permet, lors de la fermeture explicite, de masquer l'icône de la barre d'état système et le formulaire avant la fermeture. De cette façon, l'icône ne reste pas en place après la fermeture 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();
}

2voto

Cubi73 Points 843

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

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

Et considérez Environment.Exit(0); au lieu de Process.GetCurrentProcess().Kill() .

1voto

Lanello Points 39

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

veuillez vous référer à Application.Exit si vous avez construit une simple application Windows Form, sinon, référez-vous à Environnement.Exit qui est plus général.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X