我有一个系统任务托盘应用程序-我可以关闭主窗体而不是隐藏它吗
本文关键字:窗体 隐藏 系统任务 有一个 应用程序 我可以 | 更新日期: 2023-09-27 17:50:55
我有一个应用程序,它有一个主窗体和一个系统任务托盘图标。在主窗体的设计器中,我在窗体上拖动了TrayIcon
控件,因此它是主窗体的子窗体
此时,当用户按下主窗体上的关闭按钮时,它实际上只是隐藏它,这样应用程序就不会终止,除非用户右键单击TrayIcon并单击退出。但是,主窗体有很多控件和资源,当主窗体被隐藏时,它仍然会使用这些资源的内存。我的目标是实际处理表单,这样它在不使用时就不会占用内存。
除非我错了,当主形式被隐藏时,它不会再占用内存,但我不认为是这样。我不是内存方面的专家,我甚至可能完全误解了内存管理的工作原理,因此这个问题是无效的。
无论如何,如果我是正确的,当主窗体仅被隐藏时,它仍然会占用可以通过完全关闭窗体释放的内存,那么有没有一种方法可以在不终止应用程序的情况下关闭主窗体?如果是这样的话,我将需要在Program
类中创建TrayIcon
,而不是在主窗体的类中,对吗?
不,这当然没有必要。设计师的便利性鼓励了它,但您可以轻松创建一个只按需创建窗口的应用程序。您将不得不编写代码。它不需要任何检查,有一个具有基本功能的示例应用程序。编辑Program.cs文件,使其看起来像这样(需要图标,我称之为"SampleIcon"(:
static class Program {
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var cms = new ContextMenuStrip();
cms.Items.Add("Show", null, ShowForm);
cms.Items.Add("Exit", null, ExitProgram);
var ni = new NotifyIcon();
ni.Icon = Properties.Resources.SampleIcon;
ni.ContextMenuStrip = cms;
ni.Visible = true;
Application.Run();
ni.Dispose();
}
private static void ShowForm(object sender, EventArgs e) {
// Ensure the window acts like a singleton
if (MainWindow == null) {
MainWindow = new Form1();
MainWindow.FormClosed += delegate { MainWindow = null; };
MainWindow.Show();
}
else {
MainWindow.WindowState = FormWindowState.Normal;
MainWindow.BringToFront();
}
}
private static void ExitProgram(object sender, EventArgs e) {
Application.ExitThread();
}
private static Form MainWindow;
}