2009-11-27 4 views
1

닫기 (X) 단추를 클릭하면 시스템 트레이에 최소화되도록 응용 프로그램을 원합니다.C# 응용 프로그램 닫기 문제

메인 프로그램 창의 다른 버튼/메뉴를 클릭하거나 시스템 트레이 컨텍스트 메뉴 항목을 클릭해야만 닫힙니다.

창을 닫기 위해 트레이를 최소화 할 수 있습니다.

하지만 내가 직면 한 문제는 이제 애플리케이션을 닫을 수 없다는 것입니다.

내 코드입니다 (이 응용 프로그램 종료 할 수 없습니다) : 버튼에서

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void hideToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      this.Visible = false; 
     } 

     private void showToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      this.Visible = true; 
     } 

     private void quitToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      Application.DoEvents(); 
      Application.Exit(); 
     } 

     private void Form1_Resize(object sender, EventArgs e) 
     { 
      if (FormWindowState.Minimized == this.WindowState) 
      { 
       notifyIcon1.Visible = true; 
       notifyIcon1.ShowBalloonTip(500); 
       this.Hide(); 
      } 
      else if (FormWindowState.Normal == this.WindowState) 
      { 
       notifyIcon1.Visible = false; 
      } 
     } 

     private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
     { 
      e.Cancel = true; 
      this.WindowState = FormWindowState.Minimized; 
     } 

     private void notifyIcon1_DoubleClick(object sender, EventArgs e) 
     { 
      this.Show(); 
      this.WindowState = FormWindowState.Normal; 
     }   
    } 

답변

8

을, 예를 들어, 필드를 설정 :

bool isClosing; 
private void quitToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    isClosing = true; 
    Close(); 
} 

하고 "폐쇄에이를 확인 ":

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if(!isClosing) { 
     e.Cancel = true; 
     this.WindowState = FormWindowState.Minimized; 
    } 
} 
2

이벤트를 취소 한 곳의 양식 닫기 이벤트 핸들러에 항상 도달하기 때문입니다. 양식이 이미

을 최소화하는 경우

곳 조건 및 이벤트를 취소 건너

2
나는 약간 다른 접근 방식을 권장 할 수

은, 당신이 가지고있는 주요 문제는 당신이 귀하의 응용 프로그램이 형태로 실행된다는 것이다 양식이 닫히지 않도록하는 많은 대안.

시스템 트레이에 실제로있는 응용 프로그램을 사용하여 작업 할 때 사용자 지정 응용 프로그램 컨텍스트를 만드는 것이 실제로 프로세스를 단순화합니다. 내가 작성한 Here is an article은 어떻게하는지 보여줍니다.

2

닫기 동작을 재정의하는 위치에 플래그를 추가하고 close 이벤트 인수의 CloseReason 열거 형 값을 확인하여 다른 종료 사례도 처리하십시오.

bool m_NeedClose = false; 

private void quitToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    m_NeedClose = true; 
    Close(); 
} 

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if(m_NeedClose || 
     (e.CloseReason != CloseReason.UserClosing)) 
    { 
     return; 
    } 

    e.Cancel = true; 
    this.WindowState = FormWindowState.Minimized; 
} 

FormClosingEventArgs @ MSDN
CloseReason Enumeration @ MSDN