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.
12 réponses
vous pouvez définir
notifyIcon1.Visible = false;
ou
notifyIcon.Icon = null;
dans l'événement de clôture de la forme.
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();
};
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;
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.
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();
}
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.
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.
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()
.
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
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
}
modifier les codes de ...Designer.cs-dessous de codage.
protected override void Dispose(bool disposing)
{
if (disposing )
{
this.notifyicon.Dispose();
}
base.Dispose(disposing);
}