【问题标题】:Remove Notification icon on WPF application on process exit在进程退出时删除 WPF 应用程序上的通知图标
【发布时间】:2018-03-12 10:48:21
【问题描述】:

这个问题应该有一个非常简单的答案,但我似乎找不到解决方案。我在 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 并且我的应用程序通知图标一直在通知区域上徘徊,直到您将鼠标悬停在它上面。由于监控进程可以重启我的应用程序并再次关闭它几次,通知区域很快就会被通知图标的副本填满。

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

【问题讨论】:

标签: c# wpf


【解决方案1】:

通常情况下,由于 Windows 托盘的设计方式,您无法执行此操作。所有托盘图标均由其应用驱动:它们由拥有该图标的相应应用创建和删除。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    相关资源
    最近更新 更多