Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NotifyIcon即使在应用程序关闭后仍保留在任务栏中,但在鼠标悬停时消失_C#_Notifyicon - Fatal编程技术网

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
property
false
。因此,我不能有“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()