2009-11-27 109 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