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

11

У меня есть приложение WinNet .Net 3.5 C #. У него нет графического интерфейса как такового, только NotifyIcon с ContextMenu.

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

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

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

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

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

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

EDIT

Просто кое-что еще, что я заметил ...........

Я использую 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();
    }
}

Это помогает?

Ваш Ответ

6   ответов
12

ull. В противном случае значок оставался в скрытых значках на панели задач. всплывающее окно после закрытия приложения. 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
            }
        }
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

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

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

Просто поставьте notifyIcon = null; в конце

if (notifyIcon != null)
{
    notifyIcon.Visible = false;
    notifyIcon.Dispose();
    notifyIcon = null;
}
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

this.Closed += (a, b) =>
            {
                if (notifyIcon1 != null)
                {
                    notifyIcon1.Dispose();
                    notifyIcon1.Icon = null;
                    notifyIcon1.Visible = false;
                }
            };
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();
    }
}
3

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

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

_window.Closed += (s, e) => 
{
        if (_notifyIcon != null)
        {
            _notifyIcon.Visible = false;
            _notifyIcon.Dispose();
            _notifyIcon = null;
        }
};
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы