天天看點

C#實作WinForm程式的動态系統托盤圖示

1.在主窗體中添加一個 NotifyIcon 控件-notifyIcon1

2.在主窗體中添加一個 ContextMenu 控件-contextMenu1,并添加菜單項

3.設定 notifyIcon1 的屬性:

  将notifyIcon1.ContextMenu 設定為 contextMenu1

    notifyIcon1.Visible = true

    notifyIcon1.Icon 設定到一個圖示檔案

3.處理主窗體的closing事件,即關閉主窗體時就最小化到系統托盤

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)

  {

   e.Cancel = true; //取消窗體關閉事件

   this.Visible = false; //隐藏主窗體

  }

4.在系統托盤中主窗體的圖示上單擊右鍵,出現上下文菜單(contextMenu1)

在某個菜單項的方法中,確定可以恢複主窗體

private void menuItem1_Click(object sender, System.EventArgs e)

  {

   this.Visible = true; //恢複主窗體

  }

在某個菜單項的方法中,確定可以退出程式

private void menuItem2_Click(object sender, System.EventArgs e)

  {

   Application.Exit();

  }

5.也可以不使用上下文菜單來恢複窗體,直接處理notifyIcon1的DoubleClik事件(輕按兩下恢複主窗體)

private void notifyIcon1_DoubleClick(object sender, System.EventArgs e)

  {

   if (this.Visible == false)

   {

    this.Visible = true;

   }

  }

其中退出程式的那部分代碼是有問題的

Application.Exit();還是不能退出應用程式  

有人說原因在于Application.Exit還是會去調用closing 結果是被阻止關閉了,就有人用了dispose 确實能退出。

經過跟蹤确實是的。

但還是有好多疑問

MSDN上對Application.Exit的解釋是這樣的:

Exit 方法停止在所有線程上運作的所有消息循環,并關閉應用程式的所有視窗。該方法并不強制退出該應用程式。Exit 方法通常從一個消息循環内調用,該方法強制 Run 傳回。若要隻退出目前線程的某個消息循環,請調用 ExitThread。

Exit 引發下列事件并執行關聯的條件操作:

  • 為 OpenForms 屬性表示的各個窗體引發 FormClosing 事件。可以通過将這些窗體的 FormClosingEventArgs 參數的 Cancel 屬性設定為 true,取消此事件。
  • 如果多個處理程式的其中之一取消該事件,則 Exit 将傳回而無進一步操作。否則,将為每個打開的窗體引發 FormClosed 事件,然後關閉所有正在運作的消息循環和窗體。
注意:

Exit 方法不會引發 Closed 和 Closing 事件,這兩個事件自 .NET Framework 2.0 起已過時。

這樣的解釋說明讓我看的雲裡霧裡的,有點懵了。還請牛人指教。

繼續閱讀