我有一個有幾個按鈕的窗體。我的KeyPreview設置爲true,和我有Keydown
,KeyPress
,和KeyUp事件所有的閱讀停止Winform擊鍵達到子控件
form_keyevent(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
e.handled = true;
}
出於某種原因,回車鍵仍然點擊具有焦點的按鈕。我錯過了什麼?有沒有辦法解決它?
我有一個有幾個按鈕的窗體。我的KeyPreview設置爲true,和我有Keydown
,KeyPress
,和KeyUp事件所有的閱讀停止Winform擊鍵達到子控件
form_keyevent(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
e.handled = true;
}
出於某種原因,回車鍵仍然點擊具有焦點的按鈕。我錯過了什麼?有沒有辦法解決它?
按下上用聚焦按鈕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);
}
非常豐富和徹底。我不知道窗體處理的命令鍵不同。非常有用的知道。謝謝。 –
如果您的按鈕在表單上設置爲AcceptButton
屬性,則可能會發生這種情況。如果是這種情況,只需清除該屬性即可。
除了其他答案您可以添加一個KeyDown
事件處理程序到您的表單中,在其KeyEventArgs
中有一個SuppressKeyPress
屬性,它將阻止您的按鍵被髮送到父項控制。
也看到這個SO question的區別是什麼之間處理和SuppressKeyPress,
從SuppressKeyPress鏈接:
獲取或設置指示是否將該鍵事件應該被傳遞到底層的值控制。
例如:
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.Enter)
e.SuppressKeyPress = true;
}
是您的按鈕設置爲 「接受」 按鈕? –