[C#]Tray Icon C# 2009. 1. 16. 15:43

Tray Icon..

-_-a 뭐 기본적으로 그런 내용이다;;

언젠가 쉽게 쓸 일이 있겠지 ㅋㅋ

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true;//이벤트 취소
            this.WindowState = FormWindowState.Minimized;//폼 최소화
            this.ShowInTaskbar = false;//작업표시줄 표시 금지
        }

        private void Tray_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            this.Visible = true;
            this.ShowInTaskbar = true;    // 현재 프로그램을 테스크 바에 표시하게 한다.   
            this.WindowState = FormWindowState.Normal; // 폼을 윈도 상태를 normal
            Tray.Visible = false; // 트레이의 아이콘을 보이지 않게 한다. 
        }

아 -_- contextmenu 넣어줄라면?
this.tray.contextmenu=this.contextmenu(생성한것) 해주기!

트레이 아이콘이 닷넷 2.0 버전의 경우 OS를 종료 시키면 종료가 되질 않는다.

3.0에서도 실제 해 본 것은 아니지만 여기에 대한 문제점 해결을 찾다보니

몇몇 방법이 있다는 것을 알았다.

1. Flag 변수 - 시스템 종료인지 단순한 창의 종료인지 구분

2. WndProc()함수 overriding

3. Form_Closing()함수 수정

 이벤트 순서 : WM_QUERYENDSESSION - Form Close - WM_ENDSESSION

  

public static bool bEndSession = false; 
/*logoff, shutdown, restart, poweroff */

protected override void WndProc(ref Message m)
{
      const int WM_QUERYENDSESSION = 0x0011;              
      const int WM_ENDSESSION = 0x16;
      const int WM_SYSCOMMAND = 0x112;
      const int WM_CLOSE = 0x0010;
      const int SC_CLOSE = 0xF060;
           switch (m.Msg){
                case WM_QUERYENDSESSION:
                Console.WriteLine("WM_QUERYENDSESSION");
                bEndSession = true;
                break;

               case WM_ENDSESSION:
               Console.WriteLine("WM_ENDSESSION");
               break;

               case WM_SYSCOMMAND:
                    if (m.WParam.ToInt32() == SC_CLOSE)
                    {
                        Console.WriteLine("SC_CLOSE");
                    }
                    break; 

                case WM_CLOSE:
                    Console.WriteLine("WM_CLOSE");
                    break;
           }
           base.WndProc (ref m);
        }

 

private void MainForm1_Closing(object sender, System.ComponentModel.CancelEventArgs e){
            if (!bEndSession){

                e.Cancel = true;
                this.WindowState = FormWindowState.Minimized;
                this.Hide();
            }
            else{
                    //WndProc()에서 처리하도록 함.
            }

}