2008.03.27 16:26

간단한 프로그램들을 많이 작성하게 되는데 제가 만드는 간단한 프로그램들은
대부분 일정 주기로 어떤 것을 조회하거나 관리하기 위한 용도로 작성하는 프로그램이 많습니다.
이런 경우 시스템 트레이에 아이콘화 시켜 놓을 수 있으면 좋겠다는 생각을 많이 하게 되는데
이럴 때 사용할 수 있는 Tip을 알려드릴려고 합니다.

 물론 방법만 알면 어렵지 않습니다. 관련된 객체가 이미 제공되고 있기 때문에 몇 줄이면 그런 기능을
만들 수 있습니다.
먼저 알아야 하는것이 notifyIcon 입니다. notifyIcon이 시스템 트레이와 관련된 모든 기능을 제공해주는 컨트롤입니다. 먼저 툴 메뉴에서 notifyIcon을 드레그 해서 폼에 추가합니다.

사용자 삽입 이미지











NotifyIcon 컨트롤을 삽입하는 것 만으로도 이미 작업은 50% 이상 끝난 상태 입니다. 보통 우리가 트레이에 아이콘화 시킬때 사용하는 방법은 폼 닫기를 선택했을 때 입니다. 폼 닫기를 선택했을때 프로그램이 종료되어 버리면 안되기 때문에 닫기 이벤트를 핸들링해서 처리해 주어야 합니다.
사용자 삽입 이미지
 






























작성해야 할 코드는 아래에 소스를 참조하세요

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
      e.Cancel = true;
      this.Visible = false;
  }

Closing 이벤트를 핸들링 하는데 이벤트 아규멘트 중에서 Cancel 값을 True로 설정하면
방금 이벤트가 취소 되어 버립니다. 이벤트는 취소되지만 창은 안보여야 하기 때문에
this.Visible = false을 통해서 안보이게 수정해야 합니다.

한 가지더 트레이에 축소된 아이콘을 더블 클릭하면 다시 활성화 되어야하는데
이 부분은 아래와 같이 코드를 작성하시면 됩니다.

        private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            this.Visible = true;
            if (this.WindowState == FormWindowState.Minimized)
                this.WindowState = FormWindowState.Normal;
            this.Activate();
        }

notifyIcon을 더블클릭 하게 되면 다시 폼을 보이게 하고 폼의 상태를 다시 노멀 사이즈로 조정합니다.
그리고 this.Activiate()를 통해서 폼을 활성화 시킵니다.

생각보다 간단하지요..
제가 한가 아직 설명안한게 있는게 그건 바로 NotifyIcon 컨트롤의 Icon 속성에 Icon을 설정해 주셔야 한다는 점입니다. 여기에 설정된 아이콘이 시스템 트레이에서 보게 되는 아이콘입니다. 이 아이콘을 설정하지 않으시면 트레이에는 아무것도 나타나지 않게 되기 때문에 미아가 되어 버립니다. ^^

-------------------------------------------------------
김영욱 Microsoft MVP 2006~2008
-------------------------------------------------------
Email: iwinkey@hotmail.com
Blog: winkey.tistory.com
Phone: 010-2817-0063
닷넷채널: www.winkey.pe.kr
-------------------------------------------------------

신고
.NET Util, C#, tray
2007.06.25 11:41

ProcessUtil.cs와

Tip Tip Tip 2007.06.25 11:41

MS Project 연동하기 Article에서 사용된 ProcessUtil의 전체 소스 입니다.
뭐 별 내용은 없지만 여기에 남겨놓으면 나중에 써먹기 쉬울것 같아서 남겨 놓습니다. ^^
    public class ProcessUtil
    {
        /// <summary>
        /// 생성자
        /// </summary>
        public ProcessUtil()
        {
        }

        /// <summary>
        /// 프로세스를 시작한다.
        /// </summary>
        /// <param name="fileName">파일명</param>
        /// <param name="verb">변수</param>
        /// <param name="args">아규먼트</param>
        public static void StartProcess(string fileName, string verb, string args)
        {
            if (((fileName != null) && (fileName.Length > 0)) &&
                ((verb != null) && (verb.Length > 0)))
            {
                if (File.Exists(fileName))
                {
                    ProcessStartInfo startInfo;
                    startInfo = new ProcessStartInfo(fileName);

                    startInfo.Verb = verb.Trim();
                    startInfo.Arguments = args;

                    Process newProcess = new Process();
                    newProcess.StartInfo = startInfo;

                    try
                    {
                        newProcess.Start();

                        Console.WriteLine(
                            "{0} for file {1} started successfully with verb \"{2}\"!",
                            newProcess.ProcessName, fileName, startInfo.Verb);
                    }
                    catch (System.ComponentModel.Win32Exception e)
                    {
                        Console.WriteLine("  Win32Exception caught!");
                        Console.WriteLine("  Win32 error = {0}",
                            e.Message);
                    }
                    catch (System.InvalidOperationException)
                    {
                        // Catch this exception if the process exits quickly,
                        // and the properties are not accessible.
                        Console.WriteLine("File {0} started with verb {1}",
                            fileName, verb);
                    }
                }
                else
                {
                    Console.WriteLine("File not found:  {0}", fileName);
                }
            }
            else
            {
                Console.WriteLine("Invalid input for file name or verb.");
            }
        }
    }

<리스트1> ProcessUtil의 내용

<리스트1>에서 보는 것과 같이 작성하시면 필요한 프로세스를 시작할 수 있습니다.
위의 ProcessUtil class에서는 StartProcess() Method를 통해서 프로세스를 시작할 수 있는데
이때 필요한 Parameter를 넘겨주시면 됩니다.

-------------------------------------------------------
김영욱 Microsoft
MVP 2006~2007
-------------------------------------------------------
Email: iwinkey@hotmail.com
Blog: winkey.tistory.com
Phone: 016-817-0063
www.winkey.pe.kr
www.vismuri.com
-------------------------------------------------------

신고
.NET Util


티스토리 툴바