'트레이 아이콘'에 해당되는 글 1건

  1. 2009.06.08 트레이 아이콘을 가지는 윈도우 만들기 (17)

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

네이트을 보면 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하니까 잘 되네요.