Diferencia entre el evento KeyDown, el evento KeyPress y el evento KeyUp en Visual Studio

¿Alguien puede decirme la diferencia entre el evento KeyDown , el evento KeyPress y el evento KeyUp ? Revisé el sitio msdn y no lo explica mucho.

¿Puede alguien decirme en sentido lógico simple cuando ocurre cada uno de los eventos? Siento que todo el evento anterior ocurre cuando se presiona una tecla. Entonces, ¿cuál es la diferencia exacta entre ellos?

  • KeyDown: ocurre cuando la persona presiona una tecla (cuando el teclado primero detecta un dedo en una tecla, esto sucede cuando se presiona la tecla).

  • KeyPress: sucede cuando se presiona una tecla y luego se libera.

  • KeyUp: sucede cuando se lanza la clave

Tiene razón en que todos estos eventos ocurren cuando se presiona una tecla y luego se libera, en el orden que describí anteriormente.

Hmm, no estoy seguro de cuán cuidadosamente revisaste la documentación de MSDN. Establece el orden en que los tres eventos ocurren con bastante claridad:

Los eventos clave ocurren en el siguiente orden:

  1. KeyDown
  2. KeyPress
  3. Tecla Arriba

KeyDown se KeyDown tan pronto como el usuario presiona una tecla en el teclado, mientras aún lo mantienen presionado.

KeyPress se genera para las teclas de caracteres (a diferencia de KeyDown y KeyUp, que también se generan para las teclas que no son caracteres) mientras se presiona la tecla. Este es un evento de “nivel superior” que KeyDown o KeyUp, y como tal, hay diferentes datos disponibles en EventArgs .

KeyUp se KeyUp después de que el usuario suelta una tecla en el teclado.

En general, debe manejar el evento KeyUp en su aplicación. Las acciones no deben iniciarse en la UI hasta que el usuario lance la clave. Y dado que KeyUp es un evento de nivel inferior a KeyPress , siempre tendrá mucha información al scope de la mano sobre la tecla que se presionó, e incluso funcionará para manejar claves que no son de carácter.


Sin embargo, lo que hay que destacar sobre todos estos eventos es que solo se plantean por el control que tiene el foco. Eso significa que si un control de botón en su formulario actualmente tiene el foco, nunca se levantará ninguno de los eventos clave de su formulario . Esto a menudo es confuso para los progtwigdores nuevos en .NET. La mejor forma de manejar esto es anulando el método ProcessCmdKey del formulario:

 protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (keyData == (Keys.Control | Keys.A)) { MessageBox.Show("You pressed Ctrl+A!"); } } 

Aquí hay un caso en el que NO QUIERES usar KeyUp:

Tiene un cuadro de lista y al presionar la tecla Intro en una fila se invoca un diálogo de editor. Problema: si el usuario presiona la tecla Intro en el botón Aceptar del editor, un evento KeyUp (e.KeyCode = Enter) se filtrará a su cuadro de lista, haciendo que el editor se vuelva a abrir. Esto no ocurre si el usuario presiona la barra espaciadora en el botón Aceptar del editor; en ese caso, el evento KeyUp (e.KeyCode = Space) es manejado por el editor antes de que se cierre.

Aquí hay una heurística de selección que uso:

 If I'm handling the Enter key and I need to guard against a case like the one above then I use KeyDown Else if I'm handling key combinations (eg CTRL+C) then I favor* KeyDown (KeyUp can make these awkward) Else if I am allowing press & hold autorepeat then I use KeyDown Else I use KeyUp 

* Si la acción es una que se puede hacer en un producto comúnmente usado, digamos Microsoft Office, como CTRL + A (para ‘Seleccionar todo’), imito el comportamiento de Microsoft, ya que es a eso a lo que los usuarios están acostumbrados.

KeyDown luego KeyPress luego KeyUp es el orden que encuentro.

Por lo general, desea conectar KeyDown cuando se trata de una aplicación en la que un usuario mantiene presionada una tecla para la entrada de modos múltiples con la modificación del modo de teclas de control, como en una operación de cambio de clic. KeyPress es para la lógica del tipo de entrada de tecla simple, solo para obtener los trazos de tecla. KeyUp está enganchado para poner en lógica que se ejecuta después de que otra persona procese KeyPress , como modificar el contenido de un cuadro de edición de texto después de que su lógica principal de KeyPress haya tenido efecto. Francamente, no uso KeyUp tanto, pero a veces es la única forma de recibir un mensaje después de que otra persona haya procesado KeyPress y necesita verificar / corregir lo que sucedió.