Aparentemente hay muchos malentendidos sobre esto.
La única diferencia práctica entre KeyDown
y KeyPress
es que KeyPress
transmite el carácter resultante de una pulsación de tecla, y solo se llama si hay una.
En otras palabras, si presiona Asu teclado, obtendrá esta secuencia de eventos:
- KeyDown: KeyCode = Keys.A, KeyData = Keys.A, Modifiers = Keys.None
- KeyPress: KeyChar = 'a'
- KeyUp: KeyCode = Keys.A
Pero si presiona Shift+ A, obtendrá:
- KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modifiers = Keys.Shift
- KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modificadores = Keys.Shift
- KeyPress: KeyChar = 'A'
- KeyUp: KeyCode = Keys.A
- KeyUp: KeyCode = Keys.ShiftKey
Si mantiene presionadas las teclas por un tiempo, obtendrá algo como:
- KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modifiers = Keys.Shift
- KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modifiers = Keys.Shift
- KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modifiers = Keys.Shift
- KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modifiers = Keys.Shift
- KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modifiers = Keys.Shift
- KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modificadores = Keys.Shift
- KeyPress: KeyChar = 'A'
- KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modificadores = Keys.Shift
- KeyPress: KeyChar = 'A'
- KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modificadores = Keys.Shift
- KeyPress: KeyChar = 'A'
- KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modificadores = Keys.Shift
- KeyPress: KeyChar = 'A'
- KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modificadores = Keys.Shift
- KeyPress: KeyChar = 'A'
- KeyUp: KeyCode = Keys.A
- KeyUp: KeyCode = Keys.ShiftKey
Tenga en cuenta que KeyPress
se produce en el medio KeyDown
y KeyUp
, no después KeyUp
, como muchas de las otras respuestas han dicho, que KeyPress
no se llama cuando no se genera un carácter, y que KeyDown
se repite mientras la tecla se mantiene pulsada, también contrario a muchas de las otras respuestas .
Ejemplos de claves que no resultan directamente en llamadas a KeyPress
:
- Shift` Ctrl`Alt
- F1 mediante F12
- Teclas de flecha
Ejemplos de teclas que hacen resultado en llamadas a KeyPress
:
- Aa través Z, a 0través 9, etc.
- Spacebar
- Tab (KeyChar = '\ t', ASCII 9)
- Enter (KeyChar = '\ r', ASCII 13)
- Esc (KeyChar = '\ x1b', ASCII 27)
- Backspace (KeyChar = '\ b', ASCII 8)
Para los curiosos, KeyDown
se correlaciona aproximadamente con WM_KEYDOWN
, KeyPress
con WM_CHAR
y KeyUp
con WM_KEYUP
. WM_KEYDOWN
se puede llamar menos que el número de repeticiones de teclas, pero envía un recuento de repetición, que, IIRC, WinForms utiliza para generar exactamente un KeyDown por repetición.
ProcessDialogKey
y devuelve falso cuandokeyData
esKeys.Tab
oKeys.Shift | Keys.Tab
, verá la tecla Tab en la tecla (On) (Abajo | Presione | Arriba).El evento KeyPress no se genera mediante teclas que no son caracteres; sin embargo, las claves que no son caracteres generan los eventos KeyDown y KeyUp.
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress.aspx
fuente
KeyPress solo se activa con caracteres imprimibles y se activa después del evento KeyDown. Dependiendo de la configuración de retraso de escritura, puede haber múltiples eventos KeyDown y KeyPress, pero solo un evento KeyUp.
KeyDown
KeyPress
KeyUp
fuente
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".
fuente
De MSDN:
Además, KeyPress le da la oportunidad de declarar la acción como " manejada " para evitar que haga algo.
fuente
Handled
propiedad no funciona para KeyUp (SuppressKeyPress
tampoco lo es).Siempre pensé que el keydown sucedía tan pronto como presionas la tecla, presionar la tecla es la acción de presionar la tecla y soltarla.
Encontré esto que da una pequeña explicación diferente: http://bytes.com/topic/net/answers/649131-difference-keypress-keydown-event
fuente
Keydown está presionando la tecla sin soltarla, Keypress es un ciclo completo de presionar y soltar.
Dicho de otra manera, KeyDown + KeyUp = Keypress
fuente
Del desarrollador de blogs :
Para comprender la diferencia entre presionar tecla y presionar tecla, es útil comprender la diferencia entre un "carácter" y una "tecla" . Una "tecla" es un botón físico en el teclado de la computadora, mientras que un "carácter" es un símbolo escrito presionando un botón. En teoría, los eventos keydown y keyup representan teclas presionadas o liberadas, mientras que el evento keypress representa un carácter que se está escribiendo. La implementación de la teoría no es la misma en todos los navegadores.
Nota: También puede probar el Probador de eventos clave (disponible en el sitio mencionado anteriormente) para comprender este concepto.
fuente
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 tecla solo una vez, KEYUP es el evento adecuado para capturar.
fuente
KeyPress
evento se genera para cada carácter generado a partir de la entrada, tanto en respuesta a las pulsaciones de teclas físicas como cuando el carácter es el resultado de la función de repetición automática. Cómo funciona la entrada de teclado documenta este comportamiento.La explicación más fácil:
Mantuve presionada la tecla 'd' por un segundo y luego la solté.
dddddd
el evento keydown ocurrió una vez antes de que apareciera la primera d en la pantalla, el evento keypress ocurrió 6 veces y el evento keyup ocurrió después de que apareciera la última d en la pantalla.
fuente