Подтвердить что ты не робот

Проблема с NotifyIcon не исчезает в приложении Winforms

У меня есть приложение .NET 3.5 С# Winforms. Он не имеет графического интерфейса, как такового, просто NotifyIcon с ContextMenu.

Я попытался установить NotifyIcon на visible = false и удалить его в событии Application_Exit следующим образом:

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

Приложение получает код внутри скобок, но генерирует исключение null ref, когда пытается установить Visible = false.

Я прочитал в нескольких местах, чтобы поместить его в событие закрытия формы, но этот код никогда не попадает (возможно, поскольку у меня нет формы, отображающей как таковой).

Где я могу поместить этот код, чтобы он действительно работал? Если я его не вставляю, я получаю раздражающую затяжную иконку в лотке, пока вы не нажмете на нее мышь.

Приветствия.

ИЗМЕНИТЬ

Просто что-то лишнее я заметил...........

Я использую ClickOnce в приложении......... если я просто выхожу из приложения через ContextMenu в 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();
    }
}

Помогает ли это?

4b9b3361

Ответ 1

В Windows 7 мне также нужно было установить свойство Icon равным null. В противном случае значок остался в всплывающем окне "скрытые значки" после закрытия приложения. HTH кто-то.

// put this inside the window 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
            }
        }

Ответ 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();
    }
}

Ответ 3

Это то, что я делаю в WPF.

Я использую это в сочетании с David Anson Свернуть в приложение примера лотка, что позволяет подключить иконку в трее к окну (вы может открыться несколько окон).

Просто добавьте этот код в конструктор для MinimizeToTrayInstance.

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

Ответ 4

Иногда событие Application_Exit может быть увеличено несколько раз Просто поставьте notifyIcon = null; в конце

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

Ответ 5

Вы переопределили метод dispose объекта, в котором вы инициализировали notifyIcon, чтобы также удалить notifyIcon?

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

Ответ 6

Этот код работал у меня

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