Проблема с 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();
}
}
Помогает ли это?
Ответы
Ответ 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;
}
};