在进程退出时删除WPF应用程序上的通知图标

时间:2018-03-12 10:48:22

标签: c# wpf

这个问题应该有一个非常简单的答案,但我似乎无法找到解决方案。我在SO上看过类似的问题(比如NotifyIcon remains in Tray even after application closing but disappears on Mouse Hover),但它们不能涵盖我的案例。

我有一个WPF应用程序,其中包含在MainWindow方法中设置的通知图标:

InitializeComponent();
myIcon = new System.Windows.Forms.NotifyIcon();
myIcon.Icon = someFancyIcon;
myIcon.Visible = true;

在xaml上我已经定义了Window属性Closing =“Window_Closing”,这样当窗口关闭时它会调用:

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    Log.Info("Closing application");            
    myIcon.Icon = null;
    Environment.Exit(0);            
}

如果我运行应用程序并以正常方式关闭它,则会调用Window_Closing并且通知图标会按预期消失(并且信息将输出到日志中)。

问题是:此应用程序由另一个进程监控(不受我的控制),并且其他进程有时会终止WPF应用程序进程,因此永远不会调用Window_Closing,并且我的应用程序通知图标会一直停留在通知区域上,直到您将鼠标悬停在它上面。由于监控过程可以重新启动我的应用程序并多次关闭它,通知区域很快就会填满通知图标的副本。

如何删除通知图标,以便即使我的应用程序以某种异常方式完成,图标也会消失?

1 个答案:

答案 0 :(得分:0)

通常情况下,由于Windows托盘的设计原因,您无法做到这一点。所有托盘图标均由其应用驱动:它们由拥有该图标的相应应用创建并删除。

如果应用程序异常终止,则托盘对此没有任何线索。唯一的情况是将鼠标指针移到孤立的图标上,然后它将从托盘中删除,因为没有找到相应的应用程序。

那我们该怎么办?不要杀死应用程序。相反,向它发送一条消息使其关闭(因此,所有处理程序将被调用,所有资源都将被释放,包括托盘图标)。