我尝试过以下方法:
private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
if ((Keys) e.KeyValue == Keys.Escape)
this.Close();
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
然后我尝试了这个:
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
if (e.KeyCode == Keys.Escape)
this.Close();
}
Run Code Online (Sandbox Code Playgroud)
仍然没有任何工作.
我的Windows窗体表单属性上的KeyPreview设置为true ...我做错了什么?
Han*_*ant 195
无论正确的事件处理程序分配,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);
}
Run Code Online (Sandbox Code Playgroud)
接受的答案确实是正确的,我已经多次使用过这种方法.突然间,它不再起作用,所以我发现它很奇怪.主要是因为我的断点不会被ESC键击中,但它会击中其他键.
调试后我发现我的表单中的一个控件是覆盖ProcessCmdKey
方法,使用以下代码:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
// ...
if (keyData == (Keys.Escape))
{
Close();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
Run Code Online (Sandbox Code Playgroud)
......这阻止了我的表格获得ESC密钥(请注意return true
).因此,请确保没有子控件接管您的输入.