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


91

我尝试了以下方法:

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


1
您是否尝试过在这些方法中设置断点?事件处理程序是否还在触发?
史蒂夫·丹纳

1
不要将您的取消按钮命名为表单属性“ CancelButton”。否则,您似乎无法设置CancelButton。
乔纳斯·米登多夫

@SteveDanner,事件未触发。可能缺少InitializeComponent()中的声明。
InfantPro'Aravind'2011年

我认为它不起作用的原因是因为表单内的其他控件获得了焦点……
itsho 2012年

Answers:


199

不管适当的事件处理程序分配,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);
    }

10
-1,使用Form的CancelButton属性是正确的方法。
ABCD

14
gh,1980年代打来的电话,他们想找回对话框。
汉斯·帕桑

1
您还可以trueProcessCmdKey发出信号,表示已处理了密钥,从而防止了“叮”声。
诡异的

8
如果表单上具有实际的Button(或IButtonControl接口对象),则只能使用该表单的CancelButton属性。
大卫,

3
这个选项很好。CancelButton 在表单上需要其他可见的 “取消”按钮。这是多余的渲染+代码+等
V319,2018年

64

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


2
我这样做了,但是按esc键时没有触发,为什么?
Mihai Bratulescu 2014年

这对我来说很棒。对于小型表格要好得多。
knut

15

假定您有一个“取消”按钮,设置表单的CancelButton属性(在设计器中或在代码中)应自动进行此操作。只需放置代码以在Click按钮发生事件时关闭。


9

公认的答案确实是正确的,并且我已经多次使用该方法。突然,它不再起作用了,所以我发现它很奇怪。主要是因为我的断点不会被击中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 - msdn.microsoft.com/en-us/library/...
Andez

我的winform上的ListView控件似乎遇到了此问题。我想知道您是否也曾在ListView看到问题吗?
raddevus

1

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

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

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


这是解决该问题的一个好方法。我有一个带有ListView控件的表单,在这种情况下,它们似乎吞没了CancelButton(在按Esc时)。我添加了此代码,它解决了该问题。
raddevus

0

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


0

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

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

0

您还可以触发其他形式。

例如,如果您编辑Form CancelButton属性并设置按钮Cancel,则触发一个Cancel-Button。

在代码中,按以下方式处理“取消”按钮以关闭表单:

    private void btnCancel_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.Abort;
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.