個人操做系統是Win7旗艦版,VS版本是VS2012,.NET版本爲.NET Framework 4.5。windows
在窗體的FormClosing事件,第二個參數(FormClosingEventArgs類型)下有一個枚舉變量CloseReason,在窗體的FormClosed事件,第二個參數(FormClosedEventArgs類型)下也有一個枚舉變量CloseReason 。這個CloseReason枚舉在命名空間System.Windows.Forms下。函數
以下段代碼所示,CloseReason在窗體FormClosing事件的FormClosingEventArgs類型變量e中。測試
private void FormMain_FormClosing(object sender, FormClosingEventArgs e) { switch (e.CloseReason) { case CloseReason.None: { MessageBox.Show("Closing: CloseReason.None"); } break; case CloseReason.WindowsShutDown: { MessageBox.Show("Closing: CloseReason.WindowsShutDown"); } break; case CloseReason.MdiFormClosing: { MessageBox.Show("Closing: CloseReason.MdiFormClosing"); } break; case CloseReason.UserClosing: { MessageBox.Show("Closing: CloseReason.UserClosing"); } break; case CloseReason.TaskManagerClosing: { MessageBox.Show("Closing: CloseReason.TaskManagerClosing"); } break; case CloseReason.FormOwnerClosing: { MessageBox.Show("Closing: CloseReason.FormOwnerClosing"); } break; case CloseReason.ApplicationExitCall: { MessageBox.Show("Closing: CloseReason.ApplicationExitCall"); } break; } }
從元數據看,該枚舉一共有下面7個枚舉值:this
#region 程序集 System.Windows.Forms.dll, v4.0.0.0 // C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Windows.Forms.dll #endregion using System; namespace System.Windows.Forms { // 摘要: // 指定窗體關閉的緣由。 public enum CloseReason { // 摘要: // 關閉緣由未定義或者沒法肯定。 None = 0, // // 摘要: // 操做系統正在關閉全部應用程序以便準備關機。 WindowsShutDown = 1, // // 摘要: // 此多文檔界面 (MDI) 窗體的父窗體正在關閉。 MdiFormClosing = 2, // // 摘要: // 用戶正在經過用戶界面 (UI) 關閉該窗體,例如經過單擊窗體窗口上的「關閉」按鈕,經過選擇窗口控制菜單上的「關閉」按鈕,或者經過按 Alt+F4 // 等方式關閉。 UserClosing = 3, // // 摘要: // Microsoft Windows 任務管理器正在關閉應用程序。 TaskManagerClosing = 4, // // 摘要: // 全部者窗體正在關閉。 FormOwnerClosing = 5, // // 摘要: // System.Windows.Forms.Application 類的 System.Windows.Forms.Application.Exit() // 方法被調用。 ApplicationExitCall = 6, } }
該枚舉的MSDN能夠參考頁面:spa
https://msdn.microsoft.com/en-us/library/system.windows.forms.closereason(v=vs.110).aspx操作系統
除去None類型,本文對6種枚舉值都進行了測試,在此記錄下測試的結果。code
一、CloseReason.WindowsShutDownorm
當Windows被註銷、關閉時觸發此CloseReason,不過不要在這裏加入MessageBox等元素,由於一旦Windows發現當前程序遲遲關不掉,就會將此程序強制關閉。事件
二、CloseReason.MdiFormClosing文檔
當前窗體爲Mdi子窗體時,Mdi容器窗體被關閉時,在觸發當前的FormClosing和FormClosed事件時提示此CloseReason。
將當前窗體做爲MdiParent打開另外一窗體的方法:
FormChild formChild = new FormChild(); formChild.MdiParent = this; formChild.Show();
(須要將本窗體的IsMdiContainer設置爲True)
三、CloseReason.UserClosing
用戶手動關閉當前程序,好比調用Close()函數,或點擊程序右上角的「×」,關閉緣由都是CloseReason.UserClosing。
四、CloseReason.TaskManagerClosing
由任務管理器關閉窗口時,會觸發此事件,但我在測試的時候發現,任務管理器關閉窗口具備必定的強制性。設置斷點後可發現,FormClosing事件觸發後不久程序就會被任務管理器強制關閉,這個時間很是短,所以不適合在此作一些諸如彈出MessageBox的事情(由於沒有用)。
五、CloseReason.FormOwnerClosing
相似CloseReason.MdiFormClosing,若是窗體A是窗體B的owner,則窗體A關閉時,窗體B觸發FormClosing和FormClosed事件時使用此CloseReason。
關於窗體做爲owner的問題,能夠參考MSDN頁面:
https://msdn.microsoft.com/en-us/library/system.windows.window.owner(v=vs.110).aspx
將當前窗體做爲Owner打開另外一個窗體的方法:
FormChild formChild2 = new FormChild(); formChild2.Owner = this; formChild2.Show();
六、CloseReason.ApplicationExitCall
調用Application.Exit()方法退出程序時,CloseReason爲此值。
最後再說下FormClosing、FormClosed事件的調用順序:
一、FormClosing事件在窗體關閉前觸發,FormClosed事件在窗體關閉後觸發
二、若是窗體A是mdi容器,窗體B的mdi-parent是窗體A,那麼事件的調用順序是:
窗體B - FormClosing事件 - CloseReason.MdiFormClosing
窗體A - FormClosing事件 - CloseReason.UserClosing
窗體B - FormClosed事件 - CloseReason.MdiFormClosing
窗體A - FormClosed事件 - CloseReason.UserClosing
三、若是窗體A是窗體B的owner,那麼事件的調用順序是:
窗體B - FormClosing事件 - CloseReason.FormOwnerClosing
窗體A - FormClosing事件 - CloseReason.UserClosing
窗體B - FormClosed事件 - CloseReason.FormOwnerClosing
窗體A - FormClosed事件 - CloseReason.UserClosing
最後分享下我用於測試此問題的C#工程,該工程使用VS2012創建:
http://pan.baidu.com/s/1pLF3FJH
END