Какая разница между KeyDown и KeyPress в .NET?

В чем разница между событиями KeyDown и KeyPress в .net?

Ответ 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 за повтор.

Ответ 3

KeyPress запускается только печатными буквами и запускается после события KeyDown. В зависимости от настроек задержки ввода могут быть несколько событий KeyDown и KeyPress, но только одно событие KeyUp.

KeyDown

Нажатие клавиши

KeyUp

Ответ 4

KeyPress - это более высокий уровень абстракции, чем KeyDown (и KeyUp). KeyDown и KeyUp связаны с оборудованием: фактическое действие клавиши на клавиатуре. KeyPress больше "Я получил символ с клавиатуры".

Ответ 5

Из MSDN:

Ключевые события происходят в следующем порядке:

Кроме того, KeyPress дает вам возможность объявить действие как " handled", чтобы он ничего не делал.

Ответ 6

Я всегда думал, что keydown произошло, как только вы нажмете клавишу вниз, нажатие клавиши - это действие нажатия клавиши и отпускания.

Я нашел это, что дает немного другое объяснение: http://bytes.com/topic/net/answers/649131-difference-keypress-keydown-event

Ответ 7

Keydown нажимает клавишу, не отпуская ее, Keypress - это полный цикл нажатия и отпускания.

Другими словами, KeyDown + KeyUp = Keypress

Ответ 8

От Разработчик блогов:

Чтобы понять разницу между keydown и keypress, полезно понять разницу между символом " и " . "клавиша" - физическая кнопка на клавиатуре компьютера, а символ " - это символ, набранный нажатием кнопки. Теоретически события keydown и keyup представляют собой клавиши, нажатые или выпущенные, в то время как событие нажатия клавиши представляет собой символ символ. Реализация теории не одинакова во всех браузерах.

Примечание. Вы также можете попробовать Тестер ключевых событий (доступный на вышеупомянутом сайте), чтобы понять эту концепцию.

Ответ 9

KEYUP будет зафиксирован только один раз, после отпускания клавиши, независимо от того, как долго будет удерживаться клавиша, поэтому, если вы хотите зафиксировать это нажатие только один раз, KEYUP - подходящее событие для захвата.

Ответ 10

Простейшее объяснение:

Я нажал клавишу "d" на секунду, а затем отпустил.

DDDDDD

событие keydown произошло один раз до появления первого d на экране, событие нажатия клавиши произошло 6 раз, и событие keyup произошло после того, как на экране появился последний d.