自動感知窗體的關閉事件

草上爬發表於2009-01-15
有些時候當程式退出時,可能需要做一些善後處理工作。.Net框架為我們提供了非常豐富及方便的窗體關閉檢測手段,我們只要捕獲這些相關事件,然後對應處理即可,從而達到不同原因關閉窗體採取不同操作的目的。

首先,建立一個預設的Windows Form. Application,我們需要過載Form基類的OnClosing事件,然後獲取窗體關閉事件的引數資訊,即FormClosingEventArgs類的例項,根據關閉窗體的不同原因,即FormClosingEventArgs類的CloseReason屬性,提示使用者作出相應處理。Form1.cs的全部原始碼如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

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

        public static bool ShowMessage(string s)
        {
            DialogResult result = MessageBox.Show(s + "\n\n確定要關閉窗體嗎?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            return result == DialogResult.No;
        }

        protected override void OnClosing(CancelEventArgs e)
        {
            FormClosingEventArgs fce = e as FormClosingEventArgs;
            if (fce != null)
            {
                switch (fce.CloseReason)
                {
                    case CloseReason.ApplicationExitCall:
                        e.Cancel = Form1.ShowMessage("程式正準備退出!");
                        break;
                    case CloseReason.FormOwnerClosing:
                        e.Cancel = Form1.ShowMessage("主窗體正在關閉!");
                        break;
                    case CloseReason.MdiFormClosing:
                        e.Cancel = Form1.ShowMessage("MDI主窗體正在試圖關閉!");
                        break;
                    case CloseReason.None:
                        e.Cancel = Form1.ShowMessage("正在關閉窗體,但原因未知!");
                        break;
                    case CloseReason.TaskManagerClosing:
                        e.Cancel = Form1.ShowMessage("工作管理員正在試圖關閉窗體並終止程式!");
                        break;
                    case CloseReason.UserClosing:
                        e.Cancel = Form1.ShowMessage("使用者正在試圖關閉窗體!");
                        break;
                    case CloseReason.WindowsShutDown:
                        e.Cancel = Form1.ShowMessage("Windows 正在關閉,並嘗試關閉窗體!");
                        break;
                }
            }
            base.OnClosing(e);
        }
    }
}

在事件結尾不要忘記新增對基類的OnClosing()的呼叫,以保證類的完整性!

更多關於.Net下偵測窗體關閉及關閉原因的內容,請參考用於Visual Studio 2008 的MSDN:






該示例在Windows XP SP3 + Visual Studio 2008 SP1 下編譯除錯透過。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14325734/viewspace-539740/,如需轉載,請註明出處,否則將追究法律責任。

相關文章