C# 退出表格-使用“退出”的优势;ProcessDialogKey";超过;KeyUp“;

C# 退出表格-使用“退出”的优势;ProcessDialogKey";超过;KeyUp“;,c#,winforms,C#,Winforms,要在按下ESC键时关闭窗体,我始终使用: protected override bool ProcessDialogKey(Keys keyData) //Exit form if Esc is pressed { if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape) { this.Close(); return true; } return ba

要在按下ESC键时关闭窗体,我始终使用:

protected override bool ProcessDialogKey(Keys keyData) //Exit form if Esc is pressed
{
    if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
    {
        this.Close();
        return true;
    }
    return base.ProcessDialogKey(keyData);
}

private void frmMain_FormClosing(object sender, FormClosingEventArgs e) //Ask for confirmation when "X" is clicked
{
    //Define a messagebox
    const string message = "Are you sure that you want to exit the application?";
    const string caption = "Close Application";
    var result = MessageBox.Show(message, caption,
                                 MessageBoxButtons.YesNo,
                                 MessageBoxIcon.Question);

    //Cancel the action if NO is clicked
    e.Cancel = (result == DialogResult.No);
}
今天,我意识到,使用以下代码也可以实现这一点:

private void frmMain_KeyUp(object sender, KeyEventArgs e)
{            
    //Close form when ESC key is pressed
    if (e.KeyCode == Keys.Escape)
    {
        this.Close();
    }
}

private void frmMain_FormClosing(object sender, FormClosingEventArgs e) //Ask for confirmation when "X" is clicked
{
    //Define a messagebox
    const string message = "Are you sure that you want to exit the application?";
    const string caption = "Close Application";
    var result = MessageBox.Show(message, caption,
                                 MessageBoxButtons.YesNo,
                                 MessageBoxIcon.Question);

    //Cancel the action if NO is clicked
    e.Cancel = (result == DialogResult.No);
}

因此,我想知道遵循第一组代码是否有任何好处,因为第二组代码似乎更容易处理。

一般来说,它们在技术上是不同的(按照执行顺序),但它们会做相同的事情。你不必对它过于谨慎

我会使用
ProcessDialogKey
,因为即使像
TextBox
这样的控件包含焦点,
表单的
ProcessDialogKey
也会运行,而在这种情况下,
表单的
KeyDown
keydup
仅当您将表单的
keydreview
设置为
true
时才会触发

下面是我将使用的代码:

protected override bool ProcessDialogKey(Keys keyData)
{
    if (keyData == Keys.Escape)
    {
        this.Close();
        return true;
    }
    return base.ProcessDialogKey(keyData);
}
它的工作方式很安静。

只是为了玩,有人可能会说这两种方法都不适合此函数,因为表单类为此目的公开了

获取或设置用户按ESC键时单击的按钮控件

此属性的类型为
IButtonControl
。因此表单本身可以实现该接口,并充当自己的
CancelButton

public partial class Form1 : Form, IButtonControl
{
    public Form1()
    {
        InitializeComponent();
        CancelButton = this;
    }

    DialogResult IButtonControl.DialogResult
    {
        get {return  DialogResult.OK;}
        set {}
    }
    void IButtonControl.NotifyDefault(bool value) { }

    void IButtonControl.PerformClick()
    {
        this.DialogResult = DialogResult.Cancel;
        this.Close();
    }
}

当然,如果表单显示实际的CancelButton,则应将其分配给Form.CancelButton属性。

那么,如果我将表单的KeyPreview设置为True,您是说这两个代码相等吗?因为我总是这么做。他们在技术上是不同的(为了执行的顺序),但他们会做同样的事情。你不必对此过于谨慎。这正是我想要理解的。谢谢,解决了。我不知道我是否应该将你的答案标记为答案,因为你的评论回答了这个问题,而不是你的实际答案。在你方便的时候一定要提出建议。谢谢,我相信这篇文章回答了你的问题:)