본문 바로가기
📁 [4] 개발자 정보 & 코드 노트/C#

C# Windows Forms 강의 39편: NotifyIcon과 ContextMenuStrip을 활용한 트레이 아이콘 구현

by wawManager 2025. 3. 14.

1. 강의 개요

이번 강의에서는 NotifyIconContextMenuStrip을 사용하여 트레이 아이콘 기능을 구현하는 방법을 학습합니다.
트레이 아이콘은 응용 프로그램을 시스템 트레이(Windows 작업 표시줄 우측 하단)에 표시하며, 사용자는 이 아이콘을 통해 앱을 제어할 수 있습니다.


2. 학습 목표

  1. NotifyIcon을 사용하여 시스템 트레이에 아이콘 추가.
  2. ContextMenuStrip을 NotifyIcon과 연결해 메뉴 동작 구현.
  3. 트레이 아이콘을 통해 폼 숨기기/표시하기.

3. NotifyIcon이란?

NotifyIcon은 시스템 트레이에 아이콘을 표시하는 Windows Forms 컨트롤입니다.

  • 트레이 아이콘: 앱이 실행 중임을 나타내고 사용자와 상호작용을 가능하게 함.
  • 컨텍스트 메뉴: ContextMenuStrip을 연결하여 사용자 동작(종료, 설정 등)을 추가 가능.

NotifyIcon 주요 속성

속성 설명 예제

Icon 트레이에 표시할 아이콘 파일 notifyIcon1.Icon = SystemIcons.Application;
Text 트레이 아이콘에 표시될 툴팁 텍스트 notifyIcon1.Text = "앱 실행 중";
ContextMenuStrip 트레이 아이콘의 메뉴 notifyIcon1.ContextMenuStrip = contextMenuStrip1;

NotifyIcon 주요 이벤트

이벤트 설명 예제

DoubleClick 아이콘을 더블 클릭했을 때 발생 notifyIcon1.DoubleClick += ...;

4. 실습: NotifyIcon과 ContextMenuStrip으로 트레이 아이콘 구현

요구사항

  1. NotifyIcon을 사용해 시스템 트레이에 아이콘 추가.
  2. ContextMenuStrip으로 "앱 열기", "종료" 메뉴 구현.
  3. 트레이 아이콘 더블 클릭 시 폼 숨기기/표시하기.

폼 구성

컨트롤 타입 이름 텍스트 위치 크기

NotifyIcon notifyIcon1 (없음) 없음 없음
ContextMenuStrip contextMenuStrip1 (없음) 없음 없음

코드 작성

Form1.cs

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        private bool isHidden = false; // 폼 숨김 상태 확인 변수

        public Form1()
        {
            InitializeComponent();
            InitializeNotifyIcon();
        }

        private void InitializeNotifyIcon()
        {
            // ContextMenuStrip 생성 및 설정
            contextMenuStrip1 = new ContextMenuStrip();
            var menuOpen = new ToolStripMenuItem("앱 열기");
            var menuExit = new ToolStripMenuItem("종료");

            menuOpen.Click += (s, e) => ShowForm();
            menuExit.Click += (s, e) => Application.Exit();

            contextMenuStrip1.Items.Add(menuOpen);
            contextMenuStrip1.Items.Add(menuExit);

            // NotifyIcon 설정
            notifyIcon1 = new NotifyIcon
            {
                Icon = SystemIcons.Application, // 기본 앱 아이콘 사용
                Text = "트레이 아이콘 예제",
                Visible = true,
                ContextMenuStrip = contextMenuStrip1 // ContextMenuStrip 연결
            };

            notifyIcon1.DoubleClick += NotifyIcon1_DoubleClick;
        }

        // NotifyIcon 더블 클릭 이벤트
        private void NotifyIcon1_DoubleClick(object sender, EventArgs e)
        {
            if (isHidden)
            {
                ShowForm();
            }
            else
            {
                HideForm();
            }
        }

        // 폼 표시
        private void ShowForm()
        {
            this.Show();
            this.WindowState = FormWindowState.Normal;
            isHidden = false;
        }

        // 폼 숨기기
        private void HideForm()
        {
            this.Hide();
            isHidden = true;
        }

        protected override void OnFormClosing(FormClosingEventArgs e)
        {
            base.OnFormClosing(e);
            // 폼 닫기 대신 숨기기 처리
            if (e.CloseReason == CloseReason.UserClosing)
            {
                e.Cancel = true;
                HideForm();
            }
        }
    }
}

Form1.Designer.cs

namespace WindowsFormsApp1
{
    partial class Form1
    {
        private System.ComponentModel.IContainer components = null;
        private NotifyIcon notifyIcon1;
        private ContextMenuStrip contextMenuStrip1;

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        private void InitializeComponent()
        {
            this.SuspendLayout();

            // Form1
            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(400, 300);
            this.Name = "Form1";
            this.Text = "트레이 아이콘 예제";
            this.ResumeLayout(false);
        }
    }
}

5. 실행 결과

  1. 트레이 아이콘 표시
    • 프로그램 실행 시, 시스템 트레이에 앱 아이콘이 표시됩니다.
    • 아이콘 위에 마우스를 올리면 툴팁 텍스트("트레이 아이콘 예제")가 표시됩니다.
  2. ContextMenuStrip 동작
    • 트레이 아이콘을 오른쪽 클릭하면 "앱 열기"와 "종료" 메뉴가 표시됩니다.
    • "앱 열기" 클릭 → 폼이 표시됩니다.
    • "종료" 클릭 → 프로그램이 종료됩니다.
  3. 아이콘 더블 클릭 동작
    • 트레이 아이콘 더블 클릭 → 폼 숨기기/표시 전환이 이루어집니다.
  4. 폼 닫기 동작
    • 버튼 클릭 시 폼이 닫히지 않고 숨겨지며, 트레이 아이콘이 유지됩니다.

6. 주요 개념 요약

  1. NotifyIcon 사용
    • 시스템 트레이에 아이콘과 컨텍스트 메뉴를 표시하는 데 사용.
    • Icon, Text, ContextMenuStrip 등의 속성을 설정.
  2. ContextMenuStrip 연결
    • NotifyIcon에 컨텍스트 메뉴를 연결해 사용자 동작을 정의.
  3. 폼 숨기기 및 표시
    • Hide() 및 Show() 메서드를 사용하여 폼의 숨김 상태를 관리.
    • FormClosing 이벤트를 재정의하여 폼 닫기를 숨김으로 대체.