退出buttonclosuresC#窗体窗体

我已经尝试了以下内容:

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); } 

您应该能够将窗体的CancelButton属性设置为您的取消button,然后您将不需要任何代码。

假设您有一个“取消”button,设置窗体的CancelButton属性(在devise器或代码中)应自动处理。 只需将代码closures在button的Click事件中即可。

接受的答案确实是正确的,我已经多次使用了这种方法。 突然,它不再工作,所以我觉得很奇怪。 主要是因为我的断点不会被按ESC键,但会击中其他键。

debugging后,我发现我的窗体中的一个控件重写了ProcessCmdKey方法,代码如下:

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

…这是阻止我的forms获得ESC键(注意return true )。 所以请确保没有任何子控件正在接pipe您的input。

按Escape键你的意思是逃生键? 根据你的代码判断,我认为这就是你想要的。 你也可以尝试Application.Exit(),但closures应该工作。 你有工作线程吗? 如果一个非后台线程正在运行,这可以保持应用程序打开。

你需要添加这个事件“KeyUp”。

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

您在表单选项中将KeyPreview设置为true,然后将Keypress事件添加到它。 在您的按键事件中,键入以下内容:

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

key.Char == 27是ASCII码中的转义值。