我有一个.Net 3.5 C#Winforms应用程序。它没有这样的GUI,只是一个带有ContextMenu的NotifyIcon。
我尝试将NotifyIcon设置为visible = false并在Application_Exit事件中将其处理,如下所示:
if (notifyIcon != null)
{
notifyIcon.Visible = false;
notifyIcon.Dispose();
}
应用程序获取括号内的代码,但在尝试设置Visible = false时抛出空引用异常。
我已经阅读过几个地方把它放在关闭事件的形式中,但是这个代码永远不会被击中(可能因为我没有这样的表格?)。
我可以在哪里放置此代码,以便实际运行?如果我没有把它放入,我会在托盘中看到恼人的挥之不去的图标,直到你将鼠标移到它上面。
干杯。
修改
我注意到了一些额外的东西............
我在应用程序中使用ClickOnce .........如果我只是通过NotifyIcon上的ContextMenu退出应用程序,则不会记录任何异常。
当应用程序在此处检查升级后触发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();
}
}
这有帮助吗?
答案 0 :(得分:12)
在Windows 7上,我还必须将Icon属性设置为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
}
}
答案 1 :(得分: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();
}
}
答案 2 :(得分:3)
这就是我在WPF中所做的。
我将此与David Anson的Minimize to tray sample app结合使用,可以将托盘图标连接到窗口(您可能打开多个窗口)。
刚刚将此代码添加到MinimizeToTrayInstance
的构造函数中。
_window.Closed += (s, e) =>
{
if (_notifyIcon != null)
{
_notifyIcon.Visible = false;
_notifyIcon.Dispose();
_notifyIcon = null;
}
};
答案 3 :(得分:0)
有时可以多次引发Application_Exit事件 只需把notifyIcon = null;最后
if (notifyIcon != null)
{
notifyIcon.Visible = false;
notifyIcon.Dispose();
notifyIcon = null;
}
答案 4 :(得分:0)
您是否已覆盖已初始化notifyIcon的对象的dispose方法以处理notifyIcon?
protected override void Dispose(bool disposing)
{
if (disposing)
{
notifyIcon.Dispose();
notifyIcon = null;
}
base.Dispose(disposing);
}
答案 5 :(得分:0)
这段代码对我有用
this.Closed += (a, b) =>
{
if (notifyIcon1 != null)
{
notifyIcon1.Dispose();
notifyIcon1.Icon = null;
notifyIcon1.Visible = false;
}
};
答案 6 :(得分:0)
在为我的英语不好对不起之前。 如果您使用“结束”退出程序。然后不要关闭通知图标。 在您将关闭notifyicon之前,稍后关闭表格。 您需要使用me.close()来关闭表单
示例 它的工作...
notifyIcon1.Icon = Nothing
notifyIcon1.Visible = False
notifyIcon1.Dispose()
Me.Close()
但不起作用
End
或仅
Me.Close()