C# NotifyIcon即使在应用程序关闭后仍保留在任务栏中,但在鼠标悬停时消失
有很多问题,所以问同样的疑问。 解决这个问题的办法是设置C# NotifyIcon即使在应用程序关闭后仍保留在任务栏中,但在鼠标悬停时消失,c#,notifyicon,C#,Notifyicon,有很多问题,所以问同样的疑问。 解决这个问题的办法是设置 notifyIcon.icon=null并在FormClosing事件中为其调用Dispose 在我的应用程序中,没有这样的表单,但是有一个通知图标,可以根据事件进行更新。 创建时,我隐藏表单并使ShowInTaskbarpropertyfalse。因此,我不能有“FormClosing”或“FormClosing”事件 如果此应用程序获取要退出的事件,它将调用Process.GetCurrentProcess().Kill()退出 我已
notifyIcon.icon=null
并在FormClosing事件中为其调用Dispose
在我的应用程序中,没有这样的表单,但是有一个通知图标,可以根据事件进行更新。
创建时,我隐藏表单并使ShowInTaskbar
propertyfalse
。因此,我不能有“FormClosing”或“FormClosing”事件
如果此应用程序获取要退出的事件,它将调用Process.GetCurrentProcess().Kill()代码>退出
我已经添加了notifyIcon.icon=null
以及杀戮前的Dispose,但在我将鼠标悬停在任务栏上之前,该图标仍然保留在任务栏上
编辑:如果我假设此行为是由于调用GetCurrentProcess().Kill()
,是否有任何优雅的方法退出应用程序,从而清除所有资源并从系统托盘中删除图标。不幸的是,这是正常行为;这是因为Windows的工作方式。你真的无能为力
请看一些建议,但没有一个对我有用
也看到
Microsoft已在Microsoft Connect上将此标记为“无法修复”。您可以设置
notifyIcon1.Visible = false;
或
在表单关闭事件中。我遇到了与您完全相同的问题
正确的方法是向进程发送WM\U CLOSE消息。
我使用我在本文中找到的c#代码。
我可以告诉您,只需使用.dispose()方法即可解决问题,但如果您终止进程而不是退出应用程序,则不会调用该方法
如果您已经构建了一个简单的Windows窗体应用程序,请参阅,否则请参阅更一般的应用程序。在FormClosing
事件中使用notifyIcon.Visible=False
,我认为WPF没有自己的notifyIcon,是吗?如果您使用的是第三方Harcodet.Wpf.TaskbarNotification,请尝试以下操作:
为了防止我的应用程序在窗口关闭时关闭(在后台运行),我将关闭窗口(点击右上角的x按钮)和实际关闭窗口(通过上下文菜单)的逻辑分开。要实现此功能,请将上下文菜单设置为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();
}
尝试Application.DoEvents()代码>将notifyIcon.Icon
设置为null
并处理后:
notifyIcon.Icon = null;
notifyIcon.Dispose();
Application.DoEvents();
并考虑<代码>环境.EXIT(0);
而不是Process.GetCurrentProcess().Kill()
当您想在按下退出或关闭按钮时使用此代码:
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();
唯一对我有效的解决方案是使用Closed事件并隐藏和处理图标
icon.BalloonTipClosed += (sender, e) => {
var thisIcon = (NotifyIcon)sender;
thisIcon.Visible = false;
thisIcon.Dispose();
};
正确的答案已经给出。但您还必须提供延迟,例如,使用计时器。只有这样,应用程序才能删除背景中的图标
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
}
编辑…Designer.cs的代码,如下所示
protected override void Dispose(bool disposing)
{
if (disposing )
{
this.notifyicon.Dispose();
}
base.Dispose(disposing);
}
组件必须按正确的顺序进行处理,如下所示:
NotifyIcon.Icon.Dispose();
NotifyIcon.Dispose();
将其添加到main窗口
关闭事件中
希望这会有所帮助。我尝试了所有这些,但没有一个对我有效。经过一段时间的思考,我意识到创建“气球”的应用程序在有机会实际处理气球之前就已经退出了。我在Application.Exit()
之前添加了一个while循环,其中包含Application.DoEvents()
命令。这允许我的NotifyIcon1\u balloottipcclosed
在退出之前实际完成对图标的处理
while (notifyIcon1.Visible)
{
Application.DoEvents();
}
Application.Exit();
提示关闭方法:(您需要包括thisIcon.visible=false
,这样才能工作)
对我来说唯一有效的方法是:
在设计屏幕上更改notifyicon1属性visible=false
在主窗体“激活”事件中插入以下代码:
在主窗体“关闭”事件中插入以下代码:
我觉得windows一直在这样做。在类似的情况下,OSX通常会在任务栏中留下一个空白,我猜这只是两个操作系统如何绘制其任务/菜单栏的一个怪癖。难道没有任何优雅的方式来退出此过程而不是“GetCurrentProcess.Kill()”吗?这会改变我的这种行为吗?它可能!我觉得是你杀了它,才导致了一些问题。在设置图标nil并进行处理之后,您可以尝试在终止之前等待下一个运行循环。@MatthewWatson您可以提供任何链接,其中显示“不会修复”?不会修复问题。@Gigi您尝试过吗?icon.ballootipclosed+=(发送方,e)=>{var thisIcon=(NotifyIcon)发件人;thisIcon.Visible=false;thisIcon.Dispose();}代码>@TheMuffinMan:这太好了!正如我想解决的那样解决了我的问题。谢谢!对于那些将落在这个答案上的人,重要的是要注意,这确实解决了这个问题。如果你的图标保持不变,那是因为你正在调试(不是所有的电脑都这样做,但我们这里有11台电脑中的2台这样做)。如果你运行exe,图标实际上会消失。这应该是公认的答案Dispose()
就是您需要的!这叫什么?+=(发送方,e)=>{//code}@user3365695这是一个lambda表达式。查看此链接,并举例说明我在学习时记得的指定学员的3种方法—学员没有得到很好的解释。委托只是一种提供方法名称的方法,稍后将由某个对象调用。你可以用你做的任何方法
while (notifyIcon1.Visible)
{
Application.DoEvents();
}
Application.Exit();
private void NotifyIcon1_BalloonTipClosed(object sender, EventArgs e)
{
var thisIcon = (NotifyIcon)sender;
thisIcon.Icon = null;
thisIcon.Visible = false;
thisIcon.Dispose();
}
NotifyIcon1.Visible = True
NotifyIcon1.Visible = false
NotifyIcon1.Icon.Dispose()
NotifyIcon1.Dispose()