繁体   English   中英

退出按钮以关闭 C# 中的 Windows 窗体窗体

[英]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...我做错了什么?

无论是否正确分配事件处理程序、 KeyPreviewCancelButton等,这都将始终有效:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM