C# Winform 攔截關閉按鈕觸發的事件

來源:互聯網
上載者:User

使用者關閉軟體時,軟體一般會給“是否確認關閉”的提示。

通常,我們把它寫在FormClosing 事件中,如果確定關閉,就關閉;否則把FormClosingEventArgs 的 Cancel 屬性設定為 true,就取消了該表單的關閉。

如果該表單是主表單,我們想在該表單關閉時關閉整個應用程式,會遇到至少兩種情況:

(1)該表單同時是啟動表單,即它是應用程式中所有表單的父類,則整個應用程式會被關閉。

(2)如果該表單不是啟動表單,比如我們做了一個歡迎表單,則應用程式中所有表單的父類就是這個歡迎表單了。這時該表單的關閉並不會關閉整個應用程式。我們需要再加入“Application.Exit()”這行代碼來退出應用程式。但同時又有問題了,父表單的關閉又會給該表單發送關閉事件,於是該事件又被調用一次,確認對話方塊又會彈出第二次。解決方案是用下面的代碼:

註:做歡迎體介面可以在主表單中,ShowDialog方法開啟歡迎介面,而不是把歡迎介面作為啟動表單。下面的方法僅有理論意義。

protected override void WndProc(ref Message m)        {            //Console.WriteLine(m.Msg);            const int WM_SYSCOMMAND = 0x0112;            const int SC_CLOSE = 0xF060;            if (m.Msg == WM_SYSCOMMAND && (int)m.WParam == SC_CLOSE)            {                //捕捉關閉表單訊息                      //使用者點擊關閉表單控制按鈕   注釋為最小化表單                   //this.WindowState = FormWindowState.Minimized;                //表單隱藏                this.Hide();                return;            }            base.WndProc(ref m);        }

***************************************************************************************************************

C# 表單關閉時可以觸發的事件

FormClosing :在表單關閉時,FormClosing 事件發生。表單關閉時,此事件會得到處理,從而釋放與此表單關聯的所有資源。如果取消此事件,則該表單保持開啟狀態。若要取消表單的關閉操作,請將傳遞給事件處理常式的 FormClosingEventArgs 的 Cancel 屬性設定為 true。

FormClosed:在使用者或 Application 類的 Close 方法或 Exit 方法關閉表單後,會發生 FormClosed 事件。若要防止表單關閉,請處理 FormClosing 事件,並將傳遞給事件處理常式的 CancelEventArgs 的 Cancel 屬性設定為 true。可以使用此事件執行一些任務,如釋放表單使用的資源,還可使用此事件儲存輸入表單中的資訊或更新其父表單。

當表單顯示為強制回應對話方塊時,單擊“關閉”按鈕(表單右上方帶 X 的按鈕)會隱藏表單並將 DialogResult 屬性設定為 DialogResult.Cancel。通過在表單的 FormClosing 事件的事件處理常式中設定 DialogResult 屬性,可以在使用者單擊“關閉”按鈕時重寫分配給 DialogResult 屬性的值。

注意
在顯示為無強制回應視窗的 Form 上調用 Close 方法時,不能調用 Show 方法使表單可見,因為表單的資源已被釋放。若要隱藏表單然後又使其可見,請使用 Hide 方法。
 

如果表單是多重文件介面 (MDI) 父表單,則在引發 MDI 父表單的 FormClosing 事件之前將引發所有 MDI 子表單的 FormClosing 事件。同樣,在引發 MDI 父表單的 FormClosed 事件之前,將引發所有 MDI 子表單的 FormClosed 事件。取消 MDI 子表單的 FormClosing 事件不能防止引發 MDI 父表單的 FormClosing 事件。但是,取消該事件會將作為參數傳遞給父表單的 FormClosingEventArgs 類的 Cancel 屬性設定成 false。要強制關閉所有 MDI 父表單和子表單,請將 MDI 父表單中的 Cancel 屬性設定成 false。

下面一個簡單例子:

private void Form2_FormClosing(object sender, FormClosingEventArgs e)  {      DialogResult result = MessageBox.Show("你確定要關閉嗎!", "提示資訊", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);      if (result == DialogResult.OK)      {          e.Cancel = false;  //點擊OK    }      else     {          e.Cancel = true;      }  }

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.