即使应用程序closures,NotifyIcon仍保留在托盘中,但在鼠标hover时消失

关于这个疑问还有很多问题。 解决scheme是设置

notifyIcon.icon = null并在FormClosing事件中调用Dispose

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

如果这个应用程序得到事件退出,它调用Process.GetCurrentProcess().Kill(); 退出。

我添加了notifyIcon.icon = null以及Dispose之前杀,但仍然图标仍然是任务栏,直到我把鼠标hover在它。

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

你可以设置

 notifyIcon1.Visible = false; 

要么

 notifyIcon.Icon = null; 

在formsclosures事件。

我唯一的解决scheme是使用Closed事件并隐藏和处理图标。

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

在FormClosing事件中使用notifyIcon.Visible = False

我不认为WPF有它自己的NotifyIcon,是吗? 如果你使用的是第三方的Harcodet.Wpf.TaskbarNotification,那么试试这个:

为了防止我的应用程序在closures窗口(在后台运行)时closures,我分离了closures窗口的逻辑(点击右上angular的xbutton)并实际closures(通过上下文菜单)。 为了使这个工作,使你的上下文菜单设置_isExplicitClose为true。 否则,它会隐藏窗口并继续运行。

这是做什么的,在明确closures,隐藏托盘图标和closures前的forms。 这样,应用程序closures后,图标就不会四处移动。

 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(); } 

我试过这个代码。 我这件事更容易。 我会写几个工具或事件。 我希望这会对你有所帮助。

当您按下“退出”或“closures”button时,使用此代码:

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

当表单closures时使用此代码:

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

重要的代码是这样的:

  notifyIcon.Dispose; 

不幸的是,这是正常的行为。 这是由于Windows的工作方式。 你真的可以做任何事情。

看到NotifyIcon的问题不消失Winforms应用程序的一些build议,但没有人为我工作。

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

微软在Microsoft Connect上标记为“不会修复”。

我可以告诉你可以简单地使用.dispose()方法来解决问题,但是如果杀死进程而不是退出应用程序,那么就不会调用这个方法。

请参阅Application.Exit如果您已经构build了一个简单的Windows窗体应用程序,请参阅更一般的Environment.Exit 。

尝试Application.DoEvents();notifyIcon.Icon设置为null并处理后:

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

并考虑Environment.Exit(0); 而不是Process.GetCurrentProcess().Kill()

我有和你一样的问题。

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

已经给出了正确的答案。 但是你也必须提供一个延迟,例如一个定时器。 只有这样,应用程序才能在后台删除图标。

 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 } 

编辑…代码如下所示的编码。

  protected override void Dispose(bool disposing) { if (disposing ) { this.notifyicon.Dispose(); } base.Dispose(disposing); } 

组件必须按如下顺序排列:

 NotifyIcon.Icon.Dispose(); NotifyIcon.Dispose(); 

将此添加到MainWindowclosures事件。

希望这会有所帮助。