¿Cuál es la diferencia entre KeyDown y KeyPress en .NET?
¿Cuál es la diferencia entre los eventos KeyDown
y KeyPress
en .NET?
¡ Aparentemente hay muchos malentendidos al respecto!
La única diferencia práctica entre KeyDown
y KeyPress
es que KeyPress
transmite 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:
- KeyDown: KeyCode=Claves.A, KeyData=Claves.A, Modificadores=Claves.Ninguno
- Pulsación de tecla: KeyChar='a'
- KeyUp: KeyCode=Claves.A
Pero si presionas Shift+ A, obtendrás:
- KeyDown: KeyCode=Keys.ShiftKey, KeyData=Keys.ShiftKey, Shift, Modificadores=Keys.Shift
- KeyDown: KeyCode=Claves.A, KeyData=Claves.A | Teclas.Shift, Modificadores=Teclas.Shift
- Pulsación de tecla: KeyChar='A'
- KeyUp: KeyCode=Claves.A
- KeyUp: KeyCode = Teclas.ShiftKey
Si mantienes presionadas las teclas por un momento, obtendrás algo como:
- KeyDown: KeyCode=Keys.ShiftKey, KeyData=Keys.ShiftKey, Shift, Modificadores=Keys.Shift
- KeyDown: KeyCode=Keys.ShiftKey, KeyData=Keys.ShiftKey, Shift, Modificadores=Keys.Shift
- KeyDown: KeyCode=Keys.ShiftKey, KeyData=Keys.ShiftKey, Shift, Modificadores=Keys.Shift
- KeyDown: KeyCode=Keys.ShiftKey, KeyData=Keys.ShiftKey, Shift, Modificadores=Keys.Shift
- KeyDown: KeyCode=Keys.ShiftKey, KeyData=Keys.ShiftKey, Shift, Modificadores=Keys.Shift
- KeyDown: KeyCode=Claves.A, KeyData=Claves.A | Teclas.Shift, Modificadores=Teclas.Shift
- Pulsación de tecla: KeyChar='A'
- KeyDown: KeyCode=Claves.A, KeyData=Claves.A | Teclas.Shift, Modificadores=Teclas.Shift
- Pulsación de tecla: KeyChar='A'
- KeyDown: KeyCode=Claves.A, KeyData=Claves.A | Teclas.Shift, Modificadores=Teclas.Shift
- Pulsación de tecla: KeyChar='A'
- KeyDown: KeyCode=Claves.A, KeyData=Claves.A | Teclas.Shift, Modificadores=Teclas.Shift
- Pulsación de tecla: KeyChar='A'
- KeyDown: KeyCode=Claves.A, KeyData=Claves.A | Teclas.Shift, Modificadores=Teclas.Shift
- Pulsación de tecla: KeyChar='A'
- KeyUp: KeyCode=Claves.A
- KeyUp: KeyCode = Teclas.ShiftKey
Observe que KeyPress
ocurre entre KeyDown
y KeyUp
, no después KeyUp
, como han indicado muchas de las otras respuestas, que KeyPress
no se llama cuando no se genera un carácter y que KeyDown
se 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, KeyDown
se correlaciona aproximadamente con WM_KEYDOWN
, KeyPress
to WM_CHAR
y KeyUp
to 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.
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
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
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".