我在“多線程:C#.NET中使用BackgroundWorker在模態對話方塊中顯示進度條”一文中介紹了如何創造一個能即時顯示程式處理進度的對話方塊,為了讓該對話方塊看起來更加逼真,除了要將表單的的FormBorderStyle屬性設為FixedDialog,將MaximizeBox和MinimizeBox設為false,將ControlBox設為false外,還需要屏蔽Alt + F4按鍵組合以防止使用者關閉對話方塊。屏蔽Alt + F4的方法有很多,這裡列出了一個比較簡單而奏效的方法。
1. 捕獲表單的KeyDown事件
給表單添加KeyDown事件,然後加入下面的代碼:
1 private void Form2_KeyDown(object sender, KeyEventArgs e)
2 {
3 if (e.KeyCode == Keys.F4 && e.Modifiers == Keys.Alt)
4 {
5 e.Handled = true;
6 }
7 }
代碼中判斷目前使用者是否按下了Alt + F4按鍵組合,如果是則執行e.Handled = true用於指示事件已經被成功執行,從而屏蔽了系統的Alt + F4功能。
2. 改寫表單的Closing事件
給表單添加Closing事件,然後加入下面的代碼:
1 public void Form2_FormClosing(object sender, FormClosingEventArgs e)
2 {
3 e.Cancel = true;
4 }
當表單被關閉時(使用者點擊表單右上方的關閉按鈕或通過程式調用表單的Close()方法)關閉動作會被取消,那麼如何才能通過程式來關閉表單呢?可以在關閉表單的代碼前去掉表單的Closing事件,如:
1 this.FormClosing -= new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
2 this.Close();
當然,你也可以選擇不關閉表單而只是隱藏它,這樣該表單不會在記憶體中被登出。上面兩行代碼只能在表單內部運行,如果你想實現在父表單中通過程式關閉子表單,可以在子表單中添加一個public類型的方法,將上面兩行代碼加入到方法中,然後在父表單中調用子表單的這個方法。如:
主表單:
1 Form2 frm = new Form2();
2 frm.CloseWindow();
子表單:
1 private void Form2_FormClosing(object sender, FormClosingEventArgs e)
2 {
3 e.Cancel = true;
4 }
5
6 public void CloseWindow()
7 {
8 this.FormClosing -= new FormClosingEventHandler(this.Form2_FormClosing);
9 this.Close();
10 }
3. 調用COM組建或全域鉤子
這類方法需要藉助於第三方的代碼來實現,過程稍微複雜一些,不太推薦使用,可考慮在一些比較特殊的場合使用。這裡有兩個例子可供參考:
http://zhidao.baidu.com/question/54482219
http://www.cnblogs.com/hbz253638398/archive/2008/05/30/1210971.html