问题与NotifyIcon的不消失的WinForms应用程序(Issue with NotifyIc

2019-06-24 15:09发布

我有一个.net 3.5 C#的WinForms应用程序。 它有没有GUI因为如此,只是一个一个ContextMenu的NotifyIcon。

我试图NotifyIcon的设置为可见=假,并在Application_Exit事件进行处置,具体如下:

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

该应用程序获取到括号内的代码,但是当它试图设置可见=假抛出空REF例外。

我读过几个地方把它的形式关闭事件,但代码永远不会被击中(也许因为我没有一个形式表现这样?)。

我在哪里可以把这个代码,所以它的实际工作? 如果我不把它在,我得到托盘中的恼人的缠绵图标,直到你在它移动鼠标。

干杯。

编辑

只是一些额外的东西我已经注意到了...........

我使用的ClickOnce的应用程序.........如果我只是退出通过文本菜单上NotifyIcon的应用程序,没有记录异常。

只需将应用程序了已检查升级后这里时会触发该事件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();
    }
}

这是否帮助?

Answer 1:

在Windows 7,我只好也设置图标属性设置为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
            }
        }


Answer 2:

此代码对我的作品,但我不知道你是如何保持你的应用程序还活着,所以......事不宜迟:

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


Answer 3:

这是我在WPF正在做。

我结合大卫·安森的使用这种最小化到托盘示例应用程序 ,它可以让你钩了一个托盘图标,窗口(你可以有多个窗口打开)。

刚刚添加该代码的构造MinimizeToTrayInstance

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


Answer 4:

有时Application_Exit事件可几次提出只要把NotifyIcon的= NULL; 到底

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


Answer 5:

此代码为我工作

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


Answer 6:

你重写你到哪儿去初始化NotifyIcon的也配置NotifyIcon的对象的Dispose方法?

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


文章来源: Issue with NotifyIcon not disappearing on Winforms App