2011-04-23 39 views
0

我有一個MDI父窗體。當用戶按下Enter時,我希望應用程序關閉。假keyvalues通過keydown事件

我檢查keydown事件如下:

private void MainForm_KeyDown(object sender, KeyEventArgs e) 
{ 

    if (e.KeyValue == (int)Keys.Enter) 
    { 
        Application.Exit(); 
    } 
} 

現在它工作正常,當我沒有對的形式(按鈕,文本框等)的任何點擊控制。 e.KeyValue具有輸入密鑰(13)的(int)值。但是,如果我將一些按鈕或文本框放在MDI窗體上,則e.KeyValue會帶來Alt鍵的密鑰值,即18。

所以,現在如果我按Alt+Enter,窗體關閉;但提前

回答

2

不僅回車鍵

感謝你需要處理的按鍵響應有點早。下面的代碼會爲你工作:

protected override bool ProcessKeyPreview(ref System.Windows.Forms.Message m) 
    { 
     int _ENTER = 13; 
     int _KEYUP = 257; 
     if (m.Msg == _ENTER && (int)m.WParam == _KEYUP) 
     { 
      Application.Exit(); 
     } 
     return base.ProcessKeyPreview(ref m); 
    } 
+0

是的,它工作完美。我只是通過交換_KEYUP和_ENTER來編輯你的答案。因爲m.MSG會給_KEYUP而不是_ENTER。 – Marshal 2011-04-23 03:42:02

+0

我仍然想知道,爲什麼呢? 我會在幾分鐘內接受它作爲答案。我只是在等待有人回答我的'爲什麼這樣'的部分! – Marshal 2011-04-23 03:42:29

+2

該鍵由當前擁有焦點的控件處理。 因此,如果按下「Enter」鍵 - 重點控制將首先處理密鑰。如果您使用附加鍵「Alt」 - 它不強制集中控制來處理密鑰。 你也可以嘗試「Ctrl」+「Enter」 - 它也應該由表單處理。有一個特殊的Form.KeyPreview屬性,但它看起來在大多數情況下工作不正常。因此,在任何控制之前,您應該在窗體中重寫ProcessKeyPreview或ProcessDialogKey方法以處理鍵。 – 2011-04-23 03:57:51

0

使用e.KeyCode and e.Modifiers;

+0

我試着這樣做:'如果(e.KeyCode == Keys.Enter && e.Modifiers == Keys.Alt)'' {'' Application.Exit ();' '}'但仍然無法正常工作 – Marshal 2011-04-23 03:33:44