即使应用程序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();
将此添加到MainWindow
closures事件。
希望这会有所帮助。