85

SO上有很多问题提出同样的疑问。解决方案是设置

notifyIcon.icon = nullDispose并在 FormClosing 事件中调用它。

在我的应用程序中,没有这样的表单,但有更新事件的通知图标。在创建时,我隐藏我的表单并创建ShowInTaskbarproperty false。因此我不能有“FormClosing”或“FormClosed”事件。

如果此应用程序获得退出事件,它会调用Process.GetCurrentProcess().Kill();退出。

notifyIcon.icon = null在杀死之前添加了和 Dispose ,但图标仍然保留在任务栏上,直到我将鼠标悬停在它上面。

编辑:如果我认为这种行为是由于调用GetCurrentProcess().Kill(),是否有任何优雅的方法可以退出应用程序,这将清除所有资源并从系统托盘中删除图标。

4

15 回答 15

53

您可以设置

notifyIcon1.Visible = false;

或者

notifyIcon.Icon = null;

在表单关闭事件中。

于 2013-05-24T18:42:41.100 回答
20

对我有用的唯一解决方案是使用 Closed 事件并隐藏和处置图标。

icon.BalloonTipClosed += (sender, e) => { 
                                            var thisIcon = (NotifyIcon)sender;
                                            thisIcon.Visible = false;
                                            thisIcon.Dispose(); 
                                        };
于 2016-05-25T18:17:48.707 回答
17

组件必须以正确的顺序放置,如下所示:

NotifyIcon.Icon.Dispose();

NotifyIcon.Dispose();

将此添加到MainWindow结束事件。

希望这会有所帮助。

于 2017-11-21T13:28:47.110 回答
13

当您按下退出或关闭按钮时,请使用此代码:

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

当您想在表单关闭时使用此代码:

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

重要的代码是这样的:

notifyIcon.Dispose();
于 2015-05-30T10:09:21.500 回答
11

notifyIcon.Visible = FalseFormClosing活动中使用

于 2014-02-28T19:34:08.737 回答
3

不幸的是,这是正常行为;这是由于 Windows 的工作方式。你真的无能为力。

有关一些建议,请参阅NotifyIcon not dissappearing on Winforms App的问题,但没有一个对我有用。

另请参阅应用程序关闭时通知图标停留在系统托盘中

Microsoft 已在 Microsoft Connect 上将此标记为“无法修复”。

于 2013-02-06T07:38:35.393 回答
3

对我有用的唯一方法是:

  1. 在设计屏幕上更改 notifyicon1 属性 visible=false

  2. 在主窗体“激活”事件中插入以下代码:

NotifyIcon1.Visible = True
  1. 在主窗体“关闭”事件中插入以下代码:
NotifyIcon1.Visible = false
NotifyIcon1.Icon.Dispose()
NotifyIcon1.Dispose()
于 2020-07-24T20:36:15.793 回答
2

我不认为 WPF 有它自己的 NotifyIcon,是吗?如果您使用的是第 3 方 Harcodet.Wpf.TaskbarNotification,请尝试以下操作:

为了防止我的应用在窗口关闭时关闭(在后台运行),我将关闭窗口(点击右上角的 x 按钮)和实际关闭(通过上下文菜单)的逻辑分开。要完成这项工作,请将上下文菜单设置_isExplicitClose为 true。否则,它只会隐藏窗口并继续运行。

这样做是在显式关闭时隐藏托盘图标和关闭前的表单。这样,应用程序关闭后图标就不会挂起。

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();
}
于 2014-03-22T21:42:59.013 回答
2

Application.DoEvents();设置notifyIcon.Icon为配置后尝试null

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

并考虑Environment.Exit(0);代替Process.GetCurrentProcess().Kill().

于 2015-02-14T00:59:59.563 回答
1

我可以告诉您,只需使用 .dispose() 方法即可解决问题,但如果您终止进程而不是退出应用程序,则不会调用该方法。

如果您已经构建了一个简单的 Windows 窗体应用程序,请参考Application.Exit,否则请参考Environment.Exit更通用的。

于 2014-02-12T18:00:34.857 回答
1

我尝试了所有这些,但没有一个对我有用。在考虑了一会儿之后,我意识到创建“气球”的应用程序在它有机会实际处理气球之前就退出了。Application.Exit()我在包含Application.DoEvents()命令之前添加了一个 while 循环。这使我NotifyIcon1_BalloonTipClosed能够在退出之前真正完成对图标的处理。

while (notifyIcon1.Visible)
{
    Application.DoEvents();
}
Application.Exit();

并且提示关闭方法:(您需要包含thisIcon.visible = false才能使其正常工作)

private void NotifyIcon1_BalloonTipClosed(object sender, EventArgs e)
{
    var thisIcon = (NotifyIcon)sender;
    thisIcon.Icon = null;
    thisIcon.Visible = false;
    thisIcon.Dispose();
}
于 2019-01-12T16:05:04.197 回答
0

我和你有完全相同的问题。

正确的方法是将 WM_CLOSE 消息发送到进程。
我使用在本文中找到的 c# 代码。
http://social.msdn.microsoft.com/Forums/vstudio/en-US/82992842-80eb-43c8-a9e6-0a6a1d19b00f/terminating-a-process-in-a-friendly-way

于 2013-06-28T08:10:37.250 回答
0

编辑 ...Designer.cs 的代码如下编码。

        protected override void Dispose(bool disposing)
           {
           if (disposing )
               {
               this.notifyicon.Dispose();
               }
           base.Dispose(disposing);
           }
于 2017-08-29T14:22:08.297 回答
0

我无法使任何其他解决方案起作用。事实证明,它是上述所有内容的混合体!我一直在寻找和啄,直到我在调试和 EXE 执行模式下都有一个始终如一的工作解决方案!我不知道为什么 MSFT 会将此标记为“不会修复”?我希望我有这种自由!

        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
    {
        //THIS CODE IS CRAZY BUT MUST BE DONE IN ORDER TO PROPERLY REMOVE THE SYSTEM TRAY ICON!
        //GREAT ARTICLE ON THIS ON STACK OVERFLOW
        //https://stackoverflow.com/questions/14723843/notifyicon-remains-in-tray-even-after-application-closing-but-disappears-on-mous

        //BTW THIS IS KIND OF A BLEND OF ALL THE SOLUTIONS BECAUSE I COULD NOT FIND A SINGLE SOLUTION THAT WOULD WORK!
        systray_icon.Visible = false;
        while (systray_icon.Visible)
        {
            Application.DoEvents();
        }
        systray_icon.Icon.Dispose();
        systray_icon.Dispose();
        Environment.Exit(1);
    }
于 2022-01-09T21:37:00.117 回答
-2

正确的答案已经给出。但是您还必须提供延迟,例如使用计时器。只有这样,应用程序仍然可以删除背景中的图标。

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 
}
于 2017-04-12T09:41:52.317 回答