2014-07-23 26 views
3

我有一個有幾個按鈕的窗體。我的KeyPreview設置爲true,和我有KeydownKeyPress,和KeyUp事件所有的閱讀停止Winform擊鍵達到子控件

form_keyevent(object sender, System.Windows.Forms.KeyPressEventArgs e) 
{ 
    e.handled = true; 
} 

出於某種原因,回車鍵仍然點擊具有焦點的按鈕。我錯過了什麼?有沒有辦法解決它?

+0

是您的按鈕設置爲 「接受」 按鈕? –

回答

1

按下上用聚焦按鈕Form回車鍵調用Form.ProcessCmdKey method

這種方法消息預處理來處理命令鍵時被調用。 命令鍵是始終優先於常規輸入鍵的鍵。命令鍵的示例包括加速器和菜單快捷方式。

您可以覆蓋此方法來標記鍵處理:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    // if enter pressed, return 'true' to skip default handler 
    if ((keyData & Keys.Return) == Keys.Return) 
     return true; 

    return base.ProcessCmdKey(ref msg, keyData); 
} 

如果你只是想忽略輸入時按鍵集中,你可以使用類似:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    // if a button is focused AND enter pressed, skip default handler 
    if (this.ActiveControl is Button && (keyData & Keys.Return) == Keys.Return) 
     return true; 

    return base.ProcessCmdKey(ref msg, keyData); 
} 
+0

非常豐富和徹底。我不知道窗體處理的命令鍵不同。非常有用的知道。謝謝。 –

1

如果您的按鈕在表單上設置爲AcceptButton屬性,則可能會發生這種情況。如果是這種情況,只需清除該屬性即可。

0

除了其他答案您可以添加一個KeyDown事件處理程序到您的表單中,在其KeyEventArgs中有一個SuppressKeyPress屬性,它將阻止您的按鍵被髮送到父項控制。

也看到這個SO question的區別是什麼之間處理和SuppressKeyPress,

從SuppressKeyPress鏈接:

獲取或設置指示是否將該鍵事件應該被傳遞到底層的值控制。

例如:

private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if(e.KeyCode == Keys.Enter) 
     e.SuppressKeyPress = true; 
}