트레이 아이콘이 닷넷 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()에서 처리하도록 함.
            }

}