Ответ 1
По-видимому, есть много недоразумений в этом!
Единственное практическое различие между KeyDown
и KeyPress
заключается в том, что KeyPress
передает символ, полученный в результате нажатия клавиши, и вызывается только в том случае, если он есть.
Другими словами, если вы нажмете A на клавиатуре, вы получите следующую последовательность событий:
- KeyDown: KeyCode = Keys.A, KeyData = Keys.A, Modifiers = Keys.None
- KeyPress: KeyChar = 'a'
- KeyUp: KeyCode = Keys.A
Но если вы нажмете Shift + A, вы получите:
- KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modifiers = Keys.Shift
- KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = Keys.Shift
- KeyPress: KeyChar = 'A'
- KeyUp: KeyCode = Keys.A
- KeyUp: KeyCode = Keys.ShiftKey
Если вы некоторое время удерживаете клавиши, вы получите что-то вроде:
- 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, Modifiers = Keys.Shift
- KeyPress: KeyChar = 'A'
- KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = Keys.Shift
- KeyPress: KeyChar = 'A'
- KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = Keys.Shift
- KeyPress: KeyChar = 'A'
- KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = Keys.Shift
- KeyPress: KeyChar = 'A'
- KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = Keys.Shift
- KeyPress: KeyChar = 'A'
- KeyUp: KeyCode = Keys.A
- KeyUp: KeyCode = Keys.ShiftKey
Обратите внимание, что KeyPress
происходит между KeyDown
и KeyUp
, не после KeyUp
, как и многие другие ответы, что KeyPress
не вызывается, когда символ не генерируется и что KeyDown
повторяется, пока клавиша удерживается нажатой, а также вопреки многим другим ответам.
Примеры клавиш не напрямую приводят к вызовам KeyPress
:
- Shift, Ctrl, Alt
- F1 через F12
- Клавиши со стрелками
Примеры клавиш, которые делают, приводят к вызовам KeyPress
:
- A через Z, 0 через 9 и т.д.
- Spacebar
- Tab (KeyChar = '\ t', ASCII 9)
- Enter (KeyChar = '\ r', ASCII 13)
- Esc (KeyChar = '\ x1b', ASCII 27)
- Backspace (KeyChar = '\ b', ASCII 8)
Для любопытных KeyDown
грубо коррелирует с WM_KEYDOWN
, KeyPress
до WM_CHAR
и KeyUp
до WM_KEYUP
. WM_KEYDOWN
можно назвать меньше, чем количество повторений клавиш, но он отправляет счетчик повторов, который использует IIRC, WinForms, чтобы генерировать ровно один KeyDown за повтор.