NotifyIcon的问题在Winforms App上没有消失

时间:2009-07-01 08:00:12

标签: c# winforms notifyicon

我有一个.Net 3.5 C#Winforms应用程序。它没有这样的GUI,只是一个带有ContextMenu的NotifyIcon。

我尝试将NotifyIcon设置为visible = false并在Application_Exit事件中将其处理,如下所示:

        if (notifyIcon != null)
        {
            notifyIcon.Visible = false;
            notifyIcon.Dispose();
        }

应用程序获取括号内的代码,但在尝试设置Visible = false时抛出空引用异常。

我已经阅读过几个地方把它放在关闭事件的形式中,但是这个代码永远不会被击中(可能因为我没有这样的表格?)。

我可以在哪里放置此代码,以便实际运行?如果我没有把它放入,我会在托盘中看到恼人的挥之不去的图标,直到你将鼠标移到它上面。

干杯。

修改

我注意到了一些额外的东西............

我在应用程序中使用ClickOnce .........如果我只是通过NotifyIcon上的ContextMenu退出应用程序,则不会记录任何异常。

当应用程序在此处检查升级后触发Application_Exit事件时...

private void CheckForUpdate()
{
    EventLogger.Instance.LogEvent("Checking for Update");
    if (ApplicationDeployment.IsNetworkDeployed && ApplicationDeployment.CurrentDeployment.CheckForUpdate())
    {
        EventLogger.Instance.LogEvent("Update available - updating");
        ApplicationDeployment.CurrentDeployment.Update();
        Application.Restart();
    }
}

这有帮助吗?

7 个答案:

答案 0 :(得分:12)

在Windows 7上,我还必须将Icon属性设置为null。否则,应用程序关闭后,图标将保留在托盘的“隐藏图标”弹出窗口中。 HTH某人。

// put this inside the window's class constructor
Application.ApplicationExit += new EventHandler(this.OnApplicationExit);


        private void OnApplicationExit(object sender, EventArgs e)
        {

            try
            {
                if (trayIcon != null)
                {
                    trayIcon.Visible = false;
                    trayIcon.Icon = null; // required to make icon disappear
                    trayIcon.Dispose();
                    trayIcon = null;
                }

            }
            catch (Exception ex)
            {
                // handle the error
            }
        }

答案 1 :(得分:3)

这段代码对我有用,但我不知道你是如何让你的应用程序保持活着的,所以......不用多说:

using System;
using System.Drawing;
using System.Windows.Forms;

static class Program
{
    static System.Threading.Timer test = 
        new System.Threading.Timer(Ticked, null, 5000, 0);

    [STAThread]
    static void Main(string[] args)
    {
        NotifyIcon ni = new NotifyIcon();
        ni.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath);
        ni.Visible = true;

        Application.Run();
        ni.Visible = false;
    }

    static void Ticked(object o) {
        Application.Exit();
    }
}

答案 2 :(得分:3)

这就是我在WPF中所做的。

我将此与David Anson的Minimize to tray sample app结合使用,可以将托盘图标连接到窗口(您可能打开多个窗口)。

刚刚将此代码添加到MinimizeToTrayInstance的构造函数中。

_window.Closed += (s, e) => 
{
        if (_notifyIcon != null)
        {
            _notifyIcon.Visible = false;
            _notifyIcon.Dispose();
            _notifyIcon = null;
        }
};

答案 3 :(得分:0)

有时可以多次引发Application_Exit事件 只需把notifyIcon = null;最后

if (notifyIcon != null)
{
    notifyIcon.Visible = false;
    notifyIcon.Dispose();
    notifyIcon = null;
}

答案 4 :(得分:0)

您是否已覆盖已初始化notifyIcon的对象的dispose方法以处理notifyIcon?

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        notifyIcon.Dispose();
        notifyIcon = null;
    }
    base.Dispose(disposing);
}

答案 5 :(得分:0)

这段代码对我有用

this.Closed += (a, b) =>
            {
                if (notifyIcon1 != null)
                {
                    notifyIcon1.Dispose();
                    notifyIcon1.Icon = null;
                    notifyIcon1.Visible = false;
                }
            };

答案 6 :(得分:0)

在为我的英语不好对不起之前。 如果您使用“结束”退出程序。然后不要关闭通知图标。 在您将关闭notifyicon之前,稍后关闭表格。 您需要使用me.close()来关闭表单

示例 它的工作...

notifyIcon1.Icon = Nothing
notifyIcon1.Visible = False
notifyIcon1.Dispose()
Me.Close()

但不起作用

End

或仅

Me.Close()