Home Full Site
System Tray 프로그램

시스템 트레이 (System Tray 혹은 Notification Area)에 작은 아이콘을 표시하고 간단한 메뉴들을 두는 응용 프로그램은 종종 백그라운드에 동작하면서 메인 UI를 가지 않는 경우가 많다. 아래 예제는 이렇게 메인 윈도우가 없이 System Tray에 아이콘으로 표시되는 App을 구현한 코드이다.
(주: 예제 코드는 중요 개념들만 소개하기 위하여 의도적으로 단순화하였다.)

System Tray 안의 Notification 아이콘은 System.Windows.Forms.NotifyIcon 클래스를 사용하여 생성한다. NotifyIcon 객체를 생성한 후, 기본적으로 .Text 와 .Icon 속성을 지정한 후 .Visible 속성을 true로 설정하면 트레이 아이콘이 표시된다.

여기에 추가로 MouseClick 이벤트에 클릭 이벤트 핸들러를 지정하면, 마우스가 NotifyIcon을 클릭했을 때, 어떤 행동을 할 지를 지정할 수 있다. 또한, .ContextMenuStrip 속성에 ContextMenuStrip 객체를 할당한 후, 필요한 메뉴 아이템들을 추가하면 오른쪽 버튼이 눌렸을 때의 컨텍스트 메뉴들을 만들 수 있다. 각각의 컨텍스트 메뉴에는 메뉴텍스트, 메뉴아이콘, 그리고 메뉴가 클릭되었을 때의 이벤트 핸들러를 지정할 수 있다.

이렇게 NotifyIcon 객체에 대한 설정이 모두 끝난 후에, Application.Run() 메서드를 호출하여 윈폼의 메인 메시지 루프를 생성하면 기본적인 프로그램이 동작하게 된다. 일반적으로 윈폼에서는 Application.Run(new Form1()) 과 같이 메인 윈도우 폼을 지정하는데, 여기서는 윈도우를 사용하지 않으므로 이러한 폼 파라미터를 지정하지 않았다.


예제

using System;
using System.Windows.Forms;
using TrayApp.Properties;

namespace TrayApp
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            using (var noti = new NotifyIcon())
            {
                noti.Text = "My Notification";
                noti.Icon = Resources.myicon;
                noti.MouseClick += Noti_MouseClick;

                noti.ContextMenuStrip = new ContextMenuStrip();
                noti.ContextMenuStrip.Items.Add("열기", Resources.open, Open_Clicked);
                noti.ContextMenuStrip.Items.Add("도움말", Resources.help, Help_Clicked);
                noti.ContextMenuStrip.Items.Add(new ToolStripSeparator());
                noti.ContextMenuStrip.Items.Add("종료", Resources.exit, Exit_Clicked);

                noti.Visible = true;

                Application.Run();
            }
        }

        private static void Noti_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                MessageBox.Show("왼쪽 버튼 클릭", "From Tray");
            }
        }

        private static void Open_Clicked(object sender, EventArgs e)
        {
            MessageBox.Show("열기 메뉴 클릭", "From Tray");
        }

        private static void Help_Clicked(object sender, EventArgs e)
        {
            MessageBox.Show("도움말 메뉴 클릭", "From Tray");
        }

        private static void Exit_Clicked(object sender, EventArgs e)
        {
            Application.Exit();
        }
    }
}

  • 위 예제에서 Resources.myicon 과 같은 Resources.* 는 리소스 파일에 있는 이미지명을 의미한다. 윈폼에서 리소스에 이미지를 넣기 위해서는 VS에서 Properties\Resources.resx 를 열고 이미지 파일을 드래그 앤 드랍하면 된다


© csharpstudy.com