Вопрос по c# – Проблема с NotifyIcon не исчезает в приложении Winforms
У меня есть приложение 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();
}
}
Это помогает?
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
}
}
но я не знаю, как вы поддерживаете свое приложение, так что ... без лишних слов:
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();
}
}
Я использую это в связи с Дэвидом АнсономСвернуть приложение в лоток, который позволяет подключить иконку в трее к окну (у вас может быть открыто несколько окон).
Просто добавил этот код в конструктор дляMinimizeToTrayInstance
.
_window.Closed += (s, e) =>
{
if (_notifyIcon != null)
{
_notifyIcon.Visible = false;
_notifyIcon.Dispose();
_notifyIcon = null;
}
};