Detener el ‘Ding’ al presionar Enter

Tengo una aplicación de formularios de Windows muy simple. Y, en Windows (o, al menos, en las aplicaciones de Windows Forms), cuando presiona Enter mientras está dentro de un Control de cuadro de texto de línea única, oye un Ding. Es un sonido desagradable, que indica que no puede ingresar una nueva línea, porque es un TextBox de una línea.

Esto está bien Sin embargo, en mi Formulario, tengo 1 TextBox y un botón de búsqueda. Y le permito al usuario realizar una búsqueda presionando Enter después de que hayan terminado de escribir, para que no tengan que usar el mouse para hacer clic en el botón Buscar.

Pero este sonido Ding ocurre. Es muy molesto.

¿Cómo podemos hacer que el sonido no se reproduzca en mi forma?

@David H – Así es como estoy detectando la tecla presionar:

private void textBox1_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { // Perform search now. } } 

Consulte la propiedad Form.AcceptButton . Puede usarlo para especificar un botón predeterminado para un formulario, en este caso para presionar enter.

De los documentos:

Esta propiedad le permite designar una acción predeterminada para que ocurra cuando el usuario presiona la tecla ENTRAR en su aplicación. El botón asignado a esta propiedad debe ser un IButtonControl que está en el formulario actual o ubicado dentro de un contenedor en el formulario actual.

También hay una propiedad CancelButton para cuando el usuario presiona escape.

Esto funciona para mi:

 private void textBox1_KeyDown(object sender, KeyEventArgs e) { //Se apertou o enter if (e.KeyCode == Keys.Enter) { //enter key is down this.doSomething(); e.Handled = true; e.SuppressKeyPress = true; } } 

El SuppressKeyPress es realmente un truco. Espero que te ayude

Tratar

 textBox.KeyPress += new KeyPressEventHandler(keypressed); private void keypressed(Object o, KeyPressEventArgs e) { if (e.KeyCode == Keys.Enter) { e.Handled = true; //this line will do the trick } } 

Puede usar KeyPress en lugar de KeyUp o KeyDown, es más eficiente y así es cómo manejarlo

  private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == (char)Keys.Enter) { e.Handled = true; button1.PerformClick(); } } 

y decir paz al ‘Ding’

Utilice SuppressKeyPress para detener el procesamiento continuo de la pulsación de tecla después de manejarlo.

 public class EntryForm: Form { public EntryForm() { } private void EntryTextBox_KeyDown(object sender, KeyEventArgs e) { if(e.KeyCode == Keys.Enter) { e.Handled = true; e.SuppressKeyPress = true; // do some stuff } else if(e.KeyCode == Keys.Escape) { e.Handled = true; e.SuppressKeyPress = true; // do some stuff } } private void EntryTextBox_KeyUp(object sender, KeyEventArgs e) { if(e.KeyCode == Keys.Enter) { // do some stuff } else if(e.KeyCode == Keys.Escape) { // do some stuff } } } 

Solo agregue e.SuppressKeyPress = true; en su statement “si”.

 private void textBox1_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { //If true, do not pass the key event to the underlying control. e.SuppressKeyPress = true; //This will suppress the "ding" sound.*/ // Perform search now. } } 

Me tropecé con esta publicación al tratar de manejar un KeyDown, esto funcionó para mí.

 If e.KeyCode = Keys.Enter Then e.SuppressKeyPress = True btnLogIn.PerformClick() End If 

Al quitar la tecla presionada se detiene el envío del evento al control subyacente. Esto debería funcionar si está manejando manualmente todo lo que la tecla Intro hará dentro de ese cuadro de texto. Perdón por el Visual Basic.

Hay muy pocas posibilidades de que alguien llegue a esta respuesta, pero algunas otras respuestas son realmente aterradoras. La supresión del evento en KeyDown mata a 2 eventos adicionales en un ataque. Establecer la propiedad e.Handled en true es inútil en este contexto.
La mejor manera es establecer la propiedad Form.AcceptButton en el botón de búsqueda real.
También hay otra forma de utilizar la tecla Enter : algunas personas pueden querer que actúe como botón TAB . Para hacerlo, agregue un nuevo Button , establezca su propiedad de Location fuera del área de Form (es decir, (-100, -100) ) – establecer la propiedad Visible en false puede deshabilitar los controladores de Button en algunos casos. Establezca la propiedad Form.AcceptButton en su nuevo botón. En el controlador de eventos Click , agregue el siguiente código
this.SelectNextControl(ActiveControl, true, true, true, true)

Ahora, es posible que desee transferir el focus solo cuando lo focus en TextBox , puede probar el tipo de ActiveControl o usar la propiedad e.Supress en los controladores de eventos de los controles que no están destinados a usar Enter como TAB Eso es todo. Ni siquiera necesita capturar e.KeyCode

Establezca la propiedad IsDefault del botón de búsqueda en true . Esto lo convertirá en un botón predeterminado y se hará clic automáticamente cuando se presione Enter.

 $("#txtSomething").keypress(function (e) { if (e.which == 13) { e.Handled = true; //This will prevent the "ding" sound //Write the rest of your code } }); 

Bueno, yo viví con este problema el tiempo suficiente y lo busqué aquí.

Después de pensar en esto por bastante tiempo y querer la forma más sencilla de solucionarlo, se me ocurrió la manera más fácil pero no tan elegante de solucionarlo.

Aquí esta lo que hice.

  1. Pon 2 botones invisibles “Ok” y “Cancelar” en el formulario.
  2. Establezca la propiedad AcceptButton y CancelButton en el formulario en los botones invisibles.
  3. ¡No se agregó código a los botones!

Esto resolvió todos los problemas secundarios enumerados en este hilo, incluido el ToolStripMenu. Mi mayor queja fue el BindingNavigator, cuando ingresaba un número de registro en la posición actual para navegar y presioné Enter.

Según la pregunta original en la que el progtwigdor quería una función de búsqueda cuando se presionó el botón enter, simplemente puse el código de búsqueda en el botón invisible de OK.

Hasta ahora, esto parece resolver todos los problemas, pero como todos sabemos con Visual Studio, probablemente surja algo.

La única otra forma elegante posible que podría pensar sería escribir una nueva clase de manejo de pulsaciones de teclas, que es mucho trabajo para la mayoría de mis proyectos.

 void RTextBox_KeyDown(object sender, KeyEventArgs e) { if (e.KeyData == Keys.Enter) { //do ... bool temp = Multiline; Multiline = true; e.Handled = true; Multiline = temp; } }