退出按钮以在C#中关闭Windows窗体表单

时间:2010-02-18 18:05:32

标签: c# winforms

我尝试了以下内容:

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

8 个答案:

答案 0 :(得分:188)

无论正确的事件处理程序分配,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);
    }

答案 1 :(得分:58)

您应该只能将表单的CancelButton属性设置为“取消”按钮,然后您将不需要任何代码。

答案 2 :(得分:15)

假设您有“取消”按钮,设置表单的CancelButton属性(在设计器或代码中)应自动处理。只需将代码放在按钮的Click事件中即可。

答案 3 :(得分:7)

接受的答案确实是正确的,我已经多次使用过这种方法。突然间,它不再起作用,所以我发现它很奇怪。主要是因为我的断点不会被 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)。因此,请确保没有子控件接管您的输入。

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:0)

按Escape按钮是指Escape键吗?根据你的代码判断,我认为这就是你想要的。您也可以尝试Application.Exit(),但Close应该可以工作。你有工人线程吗?如果正在运行非后台线程,则可以使应用程序保持打开状态。

答案 6 :(得分:0)

您需要将此添加到事件“KeyUp”。

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

答案 7 :(得分:0)

您也可以触发其他形式。

E.g。如果编辑Form CancelButton属性并设置按钮取消,则触发取消按钮。

在代码中,按照以下步骤选择取消按钮以关闭表单:

BeanManager