안녕하세요? 맨날맑음 입니다.

네이트을 보면 X(종료) 버튼을 누를시 프로그램이 꺼지지 않고, 트레이로 가게 됩니다.
이번에 알아볼 내용은 .net Windows Forms 프로젝트에서 이런 기능을 구현 하는 것입니다.

우선 준비물이 필요합니다. 트레이에 나타나게 할 아이콘 파일(.ico)입니다.
아이콘 파일은 웹상에서 마음에 드는것을 다운로드 받아도 되고, 포토샵이나 기타 프로그램으로
그림파일을 변환시켜 사용하셔도 됩니다. 물론 솔루션 탐색기 -> 해당 프로젝트(우클릭) -> 추가 -> 새항목 -> 아이콘파일을 선택하셔서 직접 그려서 사용하셔도 됩니다. 각자 취향에 맞는 아이콘을 준비해 주면 됩니다.

우선 Windows Forms 프로젝트를 생성합니다.

도구상자에서 NotifyIcon을 선택하여 Form에 추가 합니다. 추가 후 소성창의 Icon 속성에 준비해준 Ico 파일을 연결해 줍니다. 여기까지만 하고 실행시켜도 트레이에 우리 프로그램의 아이콘이 보이는 걸 볼 수 있습니다.

트레이에서 마우스 오른쪽 버튼을 눌렀을 경우 나올 메뉴를 위해 ContextMenuStrip도 추가해 줍니다.
ContextMenuStrip의 메뉴를 추가 합니다. 간단히 '종료' 메뉴(Name : ExitToolStripMenuItem)만 넣었습니다. 다시 notifyIcon1의 속성창으로 가서 ContextMenuStrip의 값을 contextMenuStrip1로 지정 합니다.
여기까지 하셨으면 프로그램 실행 시 트레이에 아이콘이 나타나게 되고, 오른쪽 버튼으로 아이콘을 클릭하면
종료 메뉴가 나타나게 됩니다.

이제 코드창(cs)으로 가서 몇가지 이벤트핸들러만 구현해 주면 트레이에 아이콘이 나타나는 프로그램을 만들수 있습니다.
using System;
using System.Windows.Forms;
namespace TraySample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.FormClosing += Form1_FormClosing;
            this.notifyIcon1.DoubleClick += notifyIcon1_DoubleClick;
            this.ExitToolStripMenuItem.Click += ExitToolStripMenuItem_Click;
        }
        // 트레이의 종료 메뉴를 눌렀을때
        void ExitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //트레이아이콘 없앰
            notifyIcon1.Visible = false;
            //프로세스 종료
            Application.Exit();
        }
        //트레이 아이콘을 더블클릭 했을시 호출
        void notifyIcon1_DoubleClick(object sender, EventArgs e)
        {
            this.Visible = true; // 폼의 표시
            if (this.WindowState == FormWindowState.Minimized)
                this.WindowState = FormWindowState.Normal; // 최소화를 멈춘다 
            this.Activate(); // 폼을 활성화 시킨다
        }
        //폼이 종료 되려 할때 호출
        void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true; // 종료 이벤트를 취소 시킨다
            this.Visible = false; // 폼을 표시하지 않는다;
        }
    }
}
주석으로 충분한 설명이 있지만 간단히 소스를 설명하면, 우선 타이틀바의 X 단추를 눌렀을때 프로그램이 종료 되는것을 막기위해 FormClosing 이벤트 핸들러에서 폼이 종료 이벤트를 취소 시켰습니다.
또한 트레이 아이콘을 더블클릭하면 폼이 다시 나와야함으로 notifyIcon1_DoubleClick 이벤트 핸들러에서 는 폼을 다시 표시하고, 활성화 시켰으며, 메뉴에서 종료를 선택했을때는 프로그램을 종료하게 하였습니다.

이렇게 간단하게 네이트온처럼 트레이에 표시되는 응용프로그램을 만들 수 있습니다.
Posted by 맨날맑음

댓글을 달아 주세요

  1. Favicon of http://www.dklee.net BlogIcon DKLEE 2009.06.09 19:16  댓글주소  수정/삭제  댓글쓰기

    좋은 포스트 입니다.^^
    좋은 정보 알아 갑니다.

  2. Favicon of https://redreans.tistory.com BlogIcon 아르다 2009.08.07 15:05 신고  댓글주소  수정/삭제  댓글쓰기

    좋은정보 가져갑니다 ^^
    그리고 코드는 어떻게 저렇게 쓸수 있나요??
    저도 오늘부터 티스토리 하는데요..저렇게 하는 방법 좀 알수 있을까요?ㅎㅎ;

    • Favicon of https://crynut84.tistory.com BlogIcon 맨날맑음 2009.08.07 22:31 신고  댓글주소  수정/삭제

      아르데나스님 댓글 감사합니다.
      도움 드릴려구 블로그에 방문에 보니 벌써 SyntaxHighlighter를 설치하여 쓰고 계시네요.
      http://crynut84.tistory.com/4 이글을 보시면 SyntaxHighlighter의 설치 / 사용 방법을 설명해 놓았습니다.

  3. Favicon of https://maenggeum.tistory.com BlogIcon MaengGeum 2009.08.12 18:10 신고  댓글주소  수정/삭제  댓글쓰기

    Application.Exit();를 사용하면 프로세서는 살아있네요.
    종료시 this.Dispose();를 해주면 제대로 종료가 된네요.

    • Favicon of https://crynut84.tistory.com BlogIcon 맨날맑음 2009.08.12 22:30 신고  댓글주소  수정/삭제

      MSDN을 보니 Application.Exit()메서드는 해당 Windows Form의 모든 Thread를 종료 시킨다고 나와잇습니다. 즉 Message Loop에서 Run이 반환되도록 하는 것이지요. Application.Exit()가 호출되면 FormClosing → FormClosed 이벤트 순서로 응용이 종료하게 됩니다.

      Form의 Dispose() 메소드는 Component에서 사용하는 모든 리소스를 해제합니다.(Component에서 상속됨)라고 하는데, 응용의 종료와는 조금 다른 개념 같네요;
      http://msdn.microsoft.com/ko-kr/library/ms157894(VS.80).aspx
      http://msdn.microsoft.com/ko-kr/library/system.windows.forms.form.dispose.aspx

    • Favicon of https://crynut84.tistory.com BlogIcon 맨날맑음 2009.08.12 22:31 신고  댓글주소  수정/삭제

      MaengGeum님 댓글 감사합니다. Application.Exit()메소드 호출시 저는 정상적으로 프로세스가 종료되는데요; 한번 시간내서 알아봐야 겠습니다.

  4. Favicon of https://maenggeum.tistory.com BlogIcon MaengGeum 2009.08.14 11:44 신고  댓글주소  수정/삭제  댓글쓰기

    저는 Ctrl+Alt+Delete 에서 프로세스 에서 확인해보면
    아직 살아 있네요~~ㅎ

  5. Skynet 2009.11.14 22:18  댓글주소  수정/삭제  댓글쓰기

    이 글을 보고 질문이 있는데 새로 프로젝트는 만드는 것이 아닌
    이미 만들어진 프로그램에
    이 것을 적용할 수는 없을까요?

    • Favicon of http://crynut84.tistory.com BlogIcon 맨날맑음 2009.11.19 21:11  댓글주소  수정/삭제

      Skynet님 안녕하세요?
      물론 미리 만들어진 프로그램에도 가능합니다.
      미리 만들어진 프로젝트를 열어 위의 과정을 똑같이 해주시면 됩니다^^

  6. EOLS 2010.04.12 21:41  댓글주소  수정/삭제  댓글쓰기

    아 정말 필요한 정보였는데 ㅠㅠ 감사합니다^^!

  7. Passowrd 2010.09.15 15:53  댓글주소  수정/삭제  댓글쓰기

    트레이 아이콘 생기고요 거기에서 오른쪽 마우스 버튼 누르면은 종료 나오는데 오른족 마우스 버튼 누르면 Context Menu 나오게 하는 방법 어떻게 하나요 부탁드려요.

  8. 킴언어 2012.11.19 15:29  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 먼저이 프로그램은 정말 감사합니다.
    근데 프로그램 종료시에요 화면만 종료 될뿐 프로세스는 종료되지 않더라구요.,
    ..ㅠㅠ어떻게 해야하나요?

  9. Favicon of https://flowerfour.tistory.com BlogIcon 엡뽀 2015.01.02 14:55 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사합니다.

    그런데 윗 분들 말씀대로 프로세스가 종료가 되질않네요.

    this.Close() 호출 후에 Form1_FormClosing 이벤트가 다시 발생하면서
    폼이 정상 종료 되지 않고 프로세스가 남아있는거 같습니다.

    MaengGeum 님 말씀 처럼 저도 Dispose로 해결했습니다.

  10. Favicon of https://flack3r.tistory.com BlogIcon flack3r 2016.02.03 23:02 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사합니다 저도 윗분들처럼 프로세스가 완전히 종료되지 않네요. FormClosing할때 종료이벤트를 true로 설정해 두어서 그런거 같습니다. 그래서 이 프로그램을 죽일때 종료이벤트를 다시 false로 설정하고 exit하니까 잘 되네요.