Botón de escape para cerrar el formulario de formularios Windows Forms en C #

91

He probado lo siguiente:

private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    if ((Keys) e.KeyValue == Keys.Escape)
        this.Close();
}

Pero no funciona.

Entonces probé esto:

protected override void OnKeyDown(KeyEventArgs e)
{
    base.OnKeyDown(e);
    if (e.KeyCode == Keys.Escape)
        this.Close();
}

Y todavía nada funciona.

El KeyPreview en las propiedades de mi formulario de Windows Forms se establece en verdadero ... ¿Qué estoy haciendo mal?

síumok
fuente
1
¿Ha intentado establecer un punto de quiebre en esos métodos? ¿El controlador de eventos está incluso disparando?
Steve Danner
1
No nombre su botón de cancelación como la propiedad del formulario 'CancelButton'. De lo contrario, parece que no puede configurar el CancelButton.
Jonas Middendorf
@SteveDanner, el evento no se activa. probablemente falta la declaración en InitializeComponent ().
InfantPro'Aravind '12 de
Creo que la razón por la que no funciona es porque otros controles dentro del formulario obtuvieron el foco ...
itsho

Respuestas:

199

Esto siempre funcionará, independientemente de la asignación adecuada del controlador de eventos, KeyPreview, CancelButton, etc.

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        if (keyData == Keys.Escape) {
            this.Close();
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
Hans Passant
fuente
10
-1, el uso de la propiedad CancelButton de Form es la forma correcta.
ABCD
14
Uf, llamaron los 80, quieren recuperar su cuadro de diálogo.
Hans Passant
1
También puede volver truede ProcessCmdKeypara indicar que la tecla está manipulada, evitando así el ruido "ding".
Spooky
8
Solo puede usar una propiedad CancelButton del formulario si el formulario tiene un Button real (o un objeto de interfaz IButtonControl).
David
3
Esta opción es buena. CancelButton requiere un botón 'Cancelar' visible adicional en el formulario. Esto es render + código + etc
redundante
64

Debería poder establecer la CancelButtonpropiedad del formulario en su botón Cancelar y luego no necesitará ningún código.

Shawn Steward
fuente
2
Hice eso pero no se dispara cuando presiono esc, ¿por qué?
Mihai Bratulescu
Esto funciono muy bien para mi. Mucho mejor para formas pequeñas.
knut
15

Suponiendo que tiene un botón "Cancelar", establecer la CancelButtonpropiedad del formulario (ya sea en el diseñador o en el código) debería encargarse de esto automáticamente. Simplemente coloque el código para cerrar en Clickcaso del botón.

Adam Robinson
fuente
9

De hecho, la respuesta aceptada es correcta, y he usado ese enfoque varias veces. De repente, ya no funcionaría, así que lo encontré extraño. Principalmente porque mi punto de interrupción no se presionaría para la ESCtecla, pero sí para otras teclas.

Después de la depuración, descubrí que uno de los controles de mi formulario era el ProcessCmdKeymétodo de reemplazo , con este código:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    // ...
    if (keyData == (Keys.Escape))
    {
        Close();
        return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

... y esto impedía que mi formulario obtuviera la ESCclave (fíjese en return true). Así que asegúrese de que ningún control infantil se haga cargo de su entrada.

Joel
fuente
En la parte superior de mi cabeza, no estoy seguro si necesita establecer el formulario KeyPreview en verdadero - msdn.microsoft.com/en-us/library/…
Andez
Parece que me encuentro con este problema con los controles ListView en mi winform. Me pregunto si es en ListView donde también vio el problema.
raddevus
1

Establece KeyPreview en verdadero en las opciones de su formulario y luego le agrega el evento Keypress. En su evento de pulsación de tecla, escribe lo siguiente:

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

key.Char == 27 es el valor de escape en código ASCII.

Kristian
fuente
Ésta es una buena solución al problema. Tengo un formulario con controles ListView y, en ese caso, parece que se tragan el CancelButton (cuando se presiona Esc). Agregué este código y solucionó el problema.
Raddevus
0

Por botón Escape, ¿te refieres a la tecla Escape? A juzgar por tu código, creo que eso es lo que quieres. También puede probar Application.Salir (), pero Cerrar debería funcionar. ¿Tiene un hilo de trabajo? Si se está ejecutando un hilo que no está en segundo plano, esto podría mantener abierta la aplicación.

SwDevMan81
fuente
0

Necesita agregar esto al evento "KeyUp".

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

También puede activar alguna otra forma.

Por ejemplo, active un botón Cancelar si edita la propiedad Formulario CancelButton y establece el botón Cancelar.

En el código, trata el botón Cancelar de la siguiente manera para cerrar el formulario:

    private void btnCancel_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.Abort;
    }
webMac
fuente