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


¿Cuál es la diferencia entre el KeyDown y KeyPress eventos en .net?


156
2017-09-02 13:30


origen


Respuestas:


Aparentemente hay mucho de malentendidos sobre esto!

La única diferencia práctica entre KeyDown y KeyPress es eso KeyPress retransmite el carácter resultante de una pulsación de tecla, y solo se llama si hay uno.

En otras palabras, si presiona UN en su teclado, obtendrá esta secuencia de eventos:

  1. KeyDown: KeyCode = Keys.A, KeyData = Keys.A, Modificadores = Keys.None
  2. KeyPress: KeyChar = 'a'
  3. KeyUp: KeyCode = Keys.A

Pero si presionas Cambio+UN, obtendrás:

  1. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modificadores = Keys.Shift
  2. KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = Keys.Shift
  3. KeyPress: KeyChar = 'A'
  4. KeyUp: KeyCode = Keys.A
  5. KeyUp: KeyCode = Keys.ShiftKey

Si mantiene presionadas las teclas durante un tiempo, obtendrá 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 = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = Keys.Shift
  7. KeyPress: KeyChar = 'A'
  8. KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = Keys.Shift
  9. KeyPress: KeyChar = 'A'
  10. KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = Keys.Shift
  11. KeyPress: KeyChar = 'A'
  12. KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = Keys.Shift
  13. KeyPress: KeyChar = 'A'
  14. KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = Keys.Shift
  15. KeyPress: KeyChar = 'A'
  16. KeyUp: KeyCode = Keys.A
  17. KeyUp: KeyCode = Keys.ShiftKey

Darse cuenta de KeyPress ocurre entre  KeyDown y KeyUp, no después KeyUp, como muchas de las otras respuestas han declarado, que KeyPress no se llama cuando un personaje no se genera, y eso KeyDown se repite mientras la tecla se mantiene presionada, también es contraria a muchas de las otras respuestas.

Ejemplos de teclas que hacen no dar lugar directamente a llamadas a KeyPress:

  • Cambio, Ctrl, Alt
  • F1 mediante F12
  • Teclas de flecha

Ejemplos de claves que hacer dar lugar a llamadas a KeyPress:

  • UN mediante Z, 0 mediante 9, etc.
  • Barra espaciadora
  • Lengüeta (KeyChar = '\ t', ASCII 9)
  • Entrar (KeyChar = '\ r', ASCII 13)
  • Esc (KeyChar = '\ x1b', ASCII 27)
  • Retroceso (KeyChar = '\ b', ASCII 8)

Para los curiosos, KeyDown aproximadamente correlaciona a WM_KEYDOWN, KeyPress a WM_CHARy KeyUp a WM_KEYUP. WM_KEYDOWN  poder se llama menos que el número de repeticiones de tecla, pero envía un conteo repetido, que, IIRC, WinForms usa para generar exactamente un KeyDown por repetición.


257
2017-09-02 13:58



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

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress.aspx


66
2017-09-02 13:34



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

KeyDown
KeyPress
Tecla Arriba


8
2017-09-02 13:39



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 personaje del teclado".


5
2017-09-02 13:43



Desde MSDN:

Los eventos clave ocurren en el siguiente orden:

  1. KeyDown 

  2. KeyPress 

  3. Tecla Arriba 

Además, KeyPress te da la oportunidad de declarar la acción como "manejado"para evitar que haga algo".


4
2017-09-02 13:35



Siempre he pensado que la pulsación de teclas ocurre tan pronto como presiona la tecla hacia abajo, presionar la tecla es la acción de presionar la tecla y soltarla.

Encontré esto que da una explicación un poco diferente: http://bytes.com/topic/net/answers/649131-difference-keypress-keydown-event


2
2017-09-02 13:32



Keydown está presionando la tecla sin soltarla, Keypress es un ciclo completo de presionar y soltar.

Dicho de otra manera, KeyDown + KeyUp = Keypress


2
2017-09-02 13:33



De Desarrollador de blogs:

Para comprender la diferencia entre la pulsación de tecla y la pulsación de tecla, es útil comprender la diferencia entre una "personaje" y un "llave". UN "llave" es un botón físico en el teclado de la computadora mientras "personaje" es un símbolo escrito al presionar un botón. En teoría, los eventos de keydown y keyup representan llaves ser presionado o liberado, mientras que el evento de pulsación de tecla representa un personaje siendo tipeado La implementación de la teoría no es la misma en todos los navegadores.

Nota: También puedes probar el Probador de eventos clave (disponible en el sitio mencionado anteriormente) para comprender este concepto.


1
2018-04-17 15:00



KEYUP se capturará solo una vez, al soltar la tecla presionada, independientemente de cuánto tiempo se mantenga presionada la tecla, por lo que si desea capturar dicha prensa solo una vez, KEYUP es el evento adecuado para capturar.


1
2018-01-09 14:08