using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Skin
{
public partial class BaseForms : Form
{
private static NotifyIcon commonNotifyIcon; // 공통 NotifyIcon
private static List<NotifyIcon> notifyIcons = new List<NotifyIcon>();
protected NotifyIcon notifyIcon;
private ContextMenuStrip contextMenu;
protected bool IsLoggedIn { get; set; } = false; // 기본값은 false
public BaseForms()
{
InitializeComponent();
InitializeNotifyIcon();
ShowInTaskbar = false;
this.Resize += BaseForm_Resize;
}
protected void InitializeNotifyIcon()
{
if (commonNotifyIcon == null) // 공통 NotifyIcon이 없을 경우에만 생성
{
commonNotifyIcon = new NotifyIcon
{
Visible = true,
Icon = Properties.Resources.AutoIcon
};
contextMenu = new ContextMenuStrip();
var exitMenuItem = new ToolStripMenuItem("종료");
exitMenuItem.Click += ExitMenuItem_Click;
contextMenu.Items.Add(exitMenuItem);
commonNotifyIcon.ContextMenuStrip = contextMenu;
}
}
private void BaseForm_Resize(object sender, EventArgs e)
{
// 폼이 최소화되면 트레이로 숨기기
if (this.WindowState == FormWindowState.Minimized)
{
this.Hide(); // 폼을 숨김
}
}
private void ExitMenuItem_Click(object sender, EventArgs e)
{
try
{
// 모든 NotifyIcon 숨기기
foreach (var notifyIcon in notifyIcons.ToList())
{
notifyIcon.Visible = false;
notifyIcon.Dispose();
}
notifyIcons.Clear();
// 공통 NotifyIcon 숨기기
if (commonNotifyIcon != null)
{
commonNotifyIcon.Visible = false;
commonNotifyIcon.Dispose();
commonNotifyIcon = null;
}
// 모든 열린 폼을 닫기
foreach (var form in Application.OpenForms.OfType<Form>().ToList())
{
form.Hide(); // 폼을 숨김
}
Application.Exit(); // 애플리케이션 종료
}
catch (Exception ex)
{
// 예외 로깅
File.AppendAllText("error_log.txt", $"{DateTime.Now}: {ex.Message}\n{ex.StackTrace}");
}
}
}
}
위는 베이스폼을 새로 만들었구요. 자질구레한 코드는 일단 제외해놓은 상태고 문제의 notifyIcon 코드 입니다.
위 폼의 디자이너.cs 파일은 아래와 같구요.
using System.Windows.Forms;
namespace Skin
{
partial class BaseForms : Form
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
if (commonNotifyIcon != null)
{
commonNotifyIcon.Visible = false;
commonNotifyIcon.Dispose();
commonNotifyIcon = null;
}
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 450);
this.Text = "Form1";
}
#endregion
}
}
예를들어서…!!
다른 폼에서
namespace Skin
{
public partial class Skin : BaseForms
이런식으로 해당 폼을 상속받으면, 프로그램 자체는 뭐 크게 문제없이 잘 돌아갑니다.
그런데… 그런데!!!
비주얼스튜디오 2022로 작업을 하고있는데…
상속을 받은 Skin 폼을 디자이너뷰로 클릭하는순간!
갑자기 트레이에 아이콘이 생기고…
어 이거 뭐지? 하고 우클릭 종료를 하면 비주얼스튜디오가 종료되요…
이 증상을 설명할수있게 찾아내고 특정짓는데만 며칠이 걸렸습니다…
요약하면,
프로그램을 만드는데, 위 베이스폼을 상속받는 폼의 디자인을 비주얼 스튜디오로 보기만 해도, 탭을 클릭만해도, 갑자기 트레이에 프로그램의 아이콘이 생기고 해당 아이콘을 우클릭 종료하면 비주얼스튜디오가 종료됩니다…
살려주실분… 왜이런지… 뭘 잘못했는지 모르겠어요…
초보입장에서는 귀신이 곡할 노릇같이만 보입니다…