2010-02-18 79 views
78

我曾嘗試以下形式:退出按鈕來關閉Windows窗體在C#

private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 
    if ((Keys) e.KeyValue == Keys.Escape) 
     this.Close(); 
} 

但它不工作。

然後我嘗試這樣的:

protected override void OnKeyDown(KeyEventArgs e) 
{ 
    base.OnKeyDown(e); 
    if (e.KeyCode == Keys.Escape) 
     this.Close(); 
} 

,仍然一無所獲的工作。

我的Windows窗體屬性中的KeyPreview設置爲true ...我做錯了什麼?

+1

您是否嘗試過在這些方法中設置斷點?事件處理程序是否還在開火? – 2010-02-18 18:08:57

+0

@SteveDanner,事件不會被觸發。可能在InitializeComponent()中聲明缺失。 – 2011-10-12 14:28:14

+1

不要將您的取消按鈕命名爲「CancelButton」。否則,似乎你不能設置CancelButton。 – 2011-08-18 08:42:36

回答

167

這將始終工作,無論正確的事件處理程序分配的,的KeyPreview,CancelButton等:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { 
     if (keyData == Keys.Escape) { 
      this.Close(); 
      return true; 
     } 
     return base.ProcessCmdKey(ref msg, keyData); 
    } 
+4

非常感謝!這是我正在尋找的! – yeahumok 2010-02-19 15:26:17

+3

像魅力 – 2010-04-05 15:13:52

+8

-1一樣工作,使用Form的CancelButton屬性是正確的方法。 – ABCD 2013-02-06 12:05:02

51

您應該可以將表格的CancelButton屬性設置爲您的取消按鈕,然後您將不需要任何代碼。

+1

我做到了,但是當我按esc時它沒有被解僱,爲什麼? – 2014-05-20 13:57:19

+0

這對我很好。對於小型表單更好。 – knut 2016-07-08 08:53:45

15

假設您有一個「取消」按鈕,設置窗體的CancelButton屬性(無論是在設計器還是在代碼中)都應該自動處理。只需將代碼關閉在按鈕的Click事件中即可。

0

按Escape鍵你的意思是Escape鍵嗎?根據你的代碼判斷,我認爲這就是你想要的。你也可以嘗試Application.Exit(),但Close應該可以工作。你有工作線程嗎?如果一個非後臺線程正在運行,這可以保持應用程序打開。

+0

downvoter的評論嗎? – SwDevMan81 2010-02-18 18:14:20

5

接受的答案確實是正確的,我已經使用了接近幾次。突然,它不再工作了,所以我覺得很奇怪。主要是因爲我的斷點不會被擊中ESC鍵,但它會擊中其他鍵。

調試後,我發現,從我的形式控制一個被重寫ProcessCmdKey方法,使用此代碼:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    // ... 
    if (keyData == (Keys.Escape)) 
    { 
     Close(); 
     return true; 
    } 
    return base.ProcessCmdKey(ref msg, keyData); 
} 

...這是防止我從形式獲得ESC鍵(請注意0​​)。所以請確保沒有任何兒童控制器正在接管您的輸入。

+0

關閉我的頭頂,不知道是否需要將窗體KeyPreview設置爲true - http://msdn.microsoft.com/en-us/library/system.windows.forms。 form.keypreview(v = vs.110)的.aspx – Andez 2015-01-12 17:21:25

0

您需要將此添加到事件「KeyUp」中。

private void Form1_KeyUp(object sender, KeyEventArgs e) 
    { 
     if(e.KeyCode == Keys.Escape) 
     { 
      this.Close(); 
     } 
    } 
0

您在表單選項中將KeyPreview設置爲true,然後向其中添加Keypress事件。在你的按鍵事件您鍵入以下內容:

private void Form1_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (e.KeyChar == 27) 
    { 
     Close(); 
    } 
} 

key.Char == 27是逃生的ASCII碼值。