退出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码中的转义值。