2010-02-18 28 views
78

He intentado lo siguiente:botón Escape para cerrar Windows Forms forman en C#

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

Pero no funciona.

Luego probé esto:

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

y sigue trabajando de nada.

La propiedad KeyPreview en mis formularios de Windows Forms está establecida en verdadero ... ¿Qué estoy haciendo mal?

+1

¿Ha intentado establecer un punto de interrupción en esos métodos? ¿El controlador de eventos incluso está disparando? –

+0

@SteveDanner, el evento no se desencadena. probablemente falta la declaración en InitializeComponent(). –

+1

No nombre su botón de cancelar como la propiedad del formulario 'CancelarBotón'. De lo contrario, parece que no puede configurar el CancelButton. –

Respuesta

167

Esto siempre funciona, independientemente de la correcta asignación de controlador de eventos, TeclaDePresentaciónPreliminar, etc CancelButton:

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

muchas gracias! esto fue EXACTAMENTE lo que estaba buscando !!! – yeahumok

+3

funcionaba como un amuleto –

+8

-1, usando la propiedad CancelButton de Formulario es la forma correcta. – ABCD

51

Solo debe poder establecer la propiedad CancelButton del Formulario en su botón Cancelar y luego no necesitará ningún código.

+1

Lo hice pero no se dispara cuando presiono esc, ¿por qué? –

+0

Esto funcionó muy bien para mí.Mucho mejor para formas pequeñas. – knut

15

Suponiendo que tiene un botón "Cancelar", la configuración de la propiedad CancelButton del formulario (ya sea en el diseñador o en el código) debe encargarse de esto automáticamente. Simplemente coloque el código para cerrar en el evento Click del botón.

0

Con el 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.Exit(), pero Close debería funcionar. ¿Tienes un hilo de trabajo? Si se está ejecutando un subproceso sin fondo, esto podría mantener la aplicación abierta.

+0

¿Algún comentario del downvoter? – SwDevMan81

5

La respuesta aceptada de hecho es correcto, y lo he utilizado un enfoque similar varias veces. De repente, ya no funcionaría, así que lo encontré extraño. Sobre todo porque mi punto de corte no se golpeó para la clave ESC, pero presionaría para otras teclas.

Después de la depuración descubrí que uno de los controles de mi forma era preponderantes con ProcessCmdKey método, 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 estaba impidiendo mi forma de conseguir la tecla ESC (observe el return true). Por lo tanto, asegúrese de que ningún control secundario se haga cargo de su información.

+0

Fuera de lo común, no estoy seguro de si necesita establecer el formulario KeyPreview en verdadero - http://msdn.microsoft.com/en-us/library/system.windows.forms. form.keypreview (v = vs.110) .aspx – Andez

0

Necesita agregar esto al evento "KeyUp".

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

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

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

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

Cuestiones relacionadas