¿Cuál es la diferencia entre KeyDown y KeyPress en .NET?

Resuelto Josh Kodroff asked hace 15 años • 10 respuestas

¿Cuál es la diferencia entre los eventos KeyDowny KeyPressen .NET?

Josh Kodroff avatar Sep 02 '09 20:09 Josh Kodroff
Aceptado

¡ Aparentemente hay muchos malentendidos al respecto!

La única diferencia práctica entre KeyDowny KeyPresses que KeyPresstransmite el carácter resultante de presionar una tecla y solo se llama si hay uno.

En otras palabras, si presionas Aen tu teclado, obtendrás esta secuencia de eventos:

  1. KeyDown: KeyCode=Claves.A, KeyData=Claves.A, Modificadores=Claves.Ninguno
  2. Pulsación de tecla: KeyChar='a'
  3. KeyUp: KeyCode=Claves.A

Pero si presionas Shift+ A, obtendrás:

  1. KeyDown: KeyCode=Keys.ShiftKey, KeyData=Keys.ShiftKey, Shift, Modificadores=Keys.Shift
  2. KeyDown: KeyCode=Claves.A, KeyData=Claves.A | Teclas.Shift, Modificadores=Teclas.Shift
  3. Pulsación de tecla: KeyChar='A'
  4. KeyUp: KeyCode=Claves.A
  5. KeyUp: KeyCode = Teclas.ShiftKey

Si mantienes presionadas las teclas por un momento, obtendrás algo como:

  1. KeyDown: KeyCode=Keys.ShiftKey, KeyData=Keys.ShiftKey, Shift, Modificadores=Keys.Shift
  2. KeyDown: KeyCode=Keys.ShiftKey, KeyData=Keys.ShiftKey, Shift, Modificadores=Keys.Shift
  3. KeyDown: KeyCode=Keys.ShiftKey, KeyData=Keys.ShiftKey, Shift, Modificadores=Keys.Shift
  4. KeyDown: KeyCode=Keys.ShiftKey, KeyData=Keys.ShiftKey, Shift, Modificadores=Keys.Shift
  5. KeyDown: KeyCode=Keys.ShiftKey, KeyData=Keys.ShiftKey, Shift, Modificadores=Keys.Shift
  6. KeyDown: KeyCode=Claves.A, KeyData=Claves.A | Teclas.Shift, Modificadores=Teclas.Shift
  7. Pulsación de tecla: KeyChar='A'
  8. KeyDown: KeyCode=Claves.A, KeyData=Claves.A | Teclas.Shift, Modificadores=Teclas.Shift
  9. Pulsación de tecla: KeyChar='A'
  10. KeyDown: KeyCode=Claves.A, KeyData=Claves.A | Teclas.Shift, Modificadores=Teclas.Shift
  11. Pulsación de tecla: KeyChar='A'
  12. KeyDown: KeyCode=Claves.A, KeyData=Claves.A | Teclas.Shift, Modificadores=Teclas.Shift
  13. Pulsación de tecla: KeyChar='A'
  14. KeyDown: KeyCode=Claves.A, KeyData=Claves.A | Teclas.Shift, Modificadores=Teclas.Shift
  15. Pulsación de tecla: KeyChar='A'
  16. KeyUp: KeyCode=Claves.A
  17. KeyUp: KeyCode = Teclas.ShiftKey

Observe que KeyPressocurre entre KeyDown y KeyUp, no después KeyUp, como han indicado muchas de las otras respuestas, que KeyPressno se llama cuando no se genera un carácter y que KeyDownse repite mientras se mantiene presionada la tecla, también al contrario de muchas de las otras respuestas. .

Ejemplos de claves que no resultan directamente en llamadas a KeyPress:

  • Shift, Ctrl,Alt
  • F1a través deF12
  • Teclas de flecha

Ejemplos de claves que resultan en llamadas a KeyPress:

  • Aa través Z, 0a través 9, etc.
  • Spacebar
  • Tab(ClaveChar='\t', ASCII 9)
  • Enter(ClaveChar='\r', ASCII 13)
  • Esc(ClaveChar='\x1b', ASCII 27)
  • Backspace(ClaveChar='\b', ASCII 8)

Para los curiosos, KeyDownse correlaciona aproximadamente con WM_KEYDOWN, KeyPressto WM_CHARy KeyUpto WM_KEYUP. WM_KEYDOWN se puede llamar menos que el número de repeticiones de teclas, pero envía un recuento de repeticiones, que IIRC, WinForms utiliza para generar exactamente una KeyDown por repetición.

P Daddy avatar Sep 02 '2009 13:09 P Daddy

El evento KeyPress no se genera mediante claves que no sean caracteres; sin embargo, las claves que no son caracteres generan los eventos KeyDown y KeyUp.

https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.control.keypress

Jon Spokes avatar Sep 02 '2009 13:09 Jon Spokes

KeyPress solo se activa con caracteres imprimibles y se activa después del evento KeyDown. Dependiendo de la configuración del retraso de escritura, puede haber múltiples eventos KeyDown y KeyPress, pero solo un evento KeyUp.

TeclaAbajo
TeclaPresionar
TeclaArriba

stevehipwell avatar Sep 02 '2009 13:09 stevehipwell

KeyPress es un nivel de abstracción más alto que KeyDown (y KeyUp). KeyDown y KeyUp están relacionados con el hardware: la acción real de una tecla en el teclado. KeyPress es más "Recibí un carácter del teclado".

Jeff Hornby avatar Sep 02 '2009 13:09 Jeff Hornby