2009-12-30 5 views
7

Tengo un formulario con un cuadro de texto único en él. Sin otros controles Cada vez que escribo la tecla 'Enter' o la tecla 'Esc', el formulario funciona como deseo; pero escucho ese horrible sonido de error de Windows. El código es similar al siguiente ...Cómo detener la ventana Sonido de error al escribir 'Entrar' o 'Esc'

public class EntryForm: Form 
{ 
    public EntryForm() 
    { 
    } 

    private void EntryTextBox_KeyUp(object sender, KeyEventArgs e) 
    { 
    if(e.KeyCode == Keys.Enter) 
    { 
     // do some stuff 
     Hide(); // I've also used DialogResult = DialogResult.OK here 
     e.Handled = true; 
    } 
    else if(e.KeyCode == Keys.Escape) 
    { 
     Hide(); // I've also used DialogResult = DialogResult.Cancel here 
     e.Handled = true; 
    } 
    } 
} 

puedo 'piratear' y hacer la parada de ruido añadiendo el siguiente código al constructor de la forma.

AcceptButton = new Button(); 
CancelButton = new Button(); 

Como dije, esto hace que el sonido no se reproduzca, pero creo que es una mala forma; especialmente porque no necesito un botón en el formulario.

¿Alguien sabe por qué este es el comportamiento y si hay una forma más clara de evitar que se reproduzca el sonido de error?

+0

Si no tiene ningún botón, ¿cómo está obteniendo el diálogo para formarse cuando presiona enter o esc? Una forma con jus un control de edición normalmente se quedará allí cuando presione enter o esc. –

+0

@ John Knoeller: el método Hide() oculta el formulario. También puede establecer la propiedad visible en falso. Si ha mostrado el formulario de forma modal, todo lo que tiene que hacer es establecer el resultado del diálogo desde el código y el formulario desaparecerá. –

Respuesta

6

Hay una solución más "correcta", una que funciona independientemente de la cantidad de controles que tenga y sigue el modelo de diseño de Windows Forms. Pegue este código en su forma:

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

@nobugz - Esto funcionó como un campeón. Gracias. –

12

En el evento KeyDown, establezca e.Handled = true y e.SuppressKeyPress = true.

+0

@Andrew: hacer esto no tuvo ningún efecto en el comportamiento. Gracias por la respuesta, sin embargo, ya que nunca antes había visto la propiedad SuppressKeyPress. –

+0

Esto funcionó para mí. – kervin

+0

¡También funcionó para mí! Gracias :) – Jake

2

Respuesta demasiado larga a la respuesta de Nobugz para caber en un comentario. Si utiliza código nobugz como es:

  1. el formulario va a ser ocultado sin importar el control en el formulario está activo y tiene el foco del teclado de entrada, y que es independiente de que el formulario tiene el 'TeclaDePresentaciónPreliminar propiedad establecida en 'verdadero o' falso.

Esto es lo que hay que hacer para que únicamente un control específico (en este caso un cuadro de texto llamado 'textBox1) se oculta en las ProcessCmdKeys de anulación:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    if (msg.HWnd == textBox1.Handle) 
    { 
     if (keyData == Keys.Escape || keyData == Keys.Enter) 
     { 
      textBox1.Hide(); 
      return true; 
     } 
    } 
    return base.ProcessCmdKey(ref msg, keyData); 
} 

Por supuesto, si se quería maneje el caso de múltiples controles que necesitan ocultarse, podría implementar una 'declaración de conmutación o lo que sea para probar el msg.HWnd contra: nota, supongo que todos los controles que podrían tener entrada de teclado tendrán un HWnd válido.

Alguna memoria (vaga) de una situación en la que utilicé esta técnica, y un control de entrada de texto de alguna manera todavía tenía el foco de entrada del teclado ... cuando no tenía intención de hacerlo ... me da ganas de agregar un prueba adicional de esta manera:

&& this.ActiveControl == textBox1 

Pero, toma que con un "grano de sal" ya que no puedo estar seguro de que sea necesario.

+0

@BillW - Gracias por la información adicional. En este caso, quiero que todo el formulario esté oculto; pero la información es buena de saber para el futuro. –

Cuestiones relacionadas