即使应用程序关闭后,NotifyIcon仍保留在托盘中,但在鼠标悬停时消失

Swa*_*and 64 c# notifyicon

关于SO的问题有很多疑问.解决方案是设置

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

在我的应用程序中,没有这样的表单,但有通知图标更新事件.在创作时,我隐藏了我的形式并制作了ShowInTaskbar财产false.因此,我不能有"FormClosing"或"FormClosed"事件.

如果此应用程序获取退出事件,则调用Process.GetCurrentProcess().Kill();退出.

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

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

Jas*_*ias 49

你可以设置

notifyIcon1.Visible = false;
Run Code Online (Sandbox Code Playgroud)

要么

notifyIcon.Icon = null;
Run Code Online (Sandbox Code Playgroud)

在结束活动的形式.

  • `icon.BalloonTipClosed += (sender, e) => { var thisIcon = (NotifyIcon)sender; thisIcon.Visible = false; thisIcon.Dispose(); };` (14认同)
  • 对于那些会回答这个问题的人来说,重要的是要注意这个问题可以解决这个问题.如果你的图标保持不变是因为你正在调试(不是所有的PC都这样做,但我们在这里做了11个中的2个).如果你运行exe,图标实际上会消失. (4认同)
  • 无法解决问题。 (2认同)
  • @TheMuffinMan:这是天才!解决了我的问题就像我想解决它一样.非常感谢! (2认同)

The*_*Man 14

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

icon.BalloonTipClosed += (sender, e) => { 
                                            var thisIcon = (NotifyIcon)sender;
                                            thisIcon.Visible = false;
                                            thisIcon.Dispose(); 
                                        };
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案......`Dispose()`就是你所需要的! (4认同)
  • @ user3365695这是一个lambda表达式.请查看此链接,并提供3种指定代理方式的示例https://msdn.microsoft.com/en-us/library/bb882516.aspx?f=255&MSPPError=-2147217396 (2认同)

小智 9

notifyIcon.Visible = FalseFormClosing事件中使用

  • 要进行 _clean_ 清理,您仍然应该调用 `notifyIcon.Dispose()`。当你的类没有你可以调用它的函数时,你应该实现`IDisposable`。 (2认同)

Shi*_*Sao 8

组件必须按照正确的顺序进行处理,如下所示:

NotifyIcon.Icon.Dispose();

NotifyIcon.Dispose();
Run Code Online (Sandbox Code Playgroud)

将此添加到MainWindow结束事件。

希望这会有所帮助。


小智 7

我试过这段代码.我觉得这更容易.我会为几个工具或事件编写它.我希望它对你有所帮助.

按"退出"或"关闭"按钮时,如果要执行此操作,请使用此代码:

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

如果要在表单关闭时执行此操作,请使用此代码:

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

重要的代码是这样的:

notifyIcon.Dispose();
Run Code Online (Sandbox Code Playgroud)