[英]Escape button to close Windows Forms form in 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...我做錯了什么?
無論是否正確分配事件處理程序、 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);
}
您應該能夠將 Form 的CancelButton
屬性設置為您的 Cancel 按鈕,然后您就不需要任何代碼了。
假設您有一個“取消”按鈕,設置表單的CancelButton
屬性(在設計器中或在代碼中)應該會自動處理這個問題。 只需將要關閉的代碼放在按鈕的Click
事件中即可。
接受的答案確實是正確的,我已經多次使用這種方法。 突然,它不再起作用了,所以我覺得很奇怪。 主要是因為我的斷點不會被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鍵(注意return true
)。 因此,請確保沒有子控件接管您的輸入。
您在表單選項中將 KeyPreview 設置為 true,然后向其中添加 Keypress 事件。 在您的按鍵事件中,您鍵入以下內容:
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 27)
{
Close();
}
}
key.Char == 27
是 ASCII 碼中的轉義值。
您需要將此添加到事件“KeyUp”中。
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.Escape)
{
this.Close();
}
}
你也可以觸發一些其他的形式。
例如,如果您編輯 Form CancelButton 屬性並將按鈕設置為 Cancel,則觸發 Cancel-Button。
在您按如下方式處理取消按鈕以關閉表單的代碼中:
private void btnCancel_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Abort;
}
Escape 按鈕是指 Escape 鍵嗎? 從你的代碼來看,我認為這就是你想要的。 您也可以嘗試 Application.Exit(),但 Close 應該可以工作。 你有工作線程嗎? 如果非后台線程正在運行,這可能會使應用程序保持打開狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.