Яка різниця між KeyDown і KeyPress у .NET?


Відповіді:


308

Мабуть, багато непорозумінь з цього приводу!

Єдина практична відмінність між KeyDownі KeyPressполягає в тому, що KeyPressретрансляція символу, що виникає в результаті натискання клавіші, і викликається лише за наявності.

Іншими словами, якщо натиснути Aна клавіатурі, ви отримаєте таку послідовність подій:

  1. KeyDown: KeyCode = Ключі.A, KeyData = Ключі.A, Модифікатори = Ключі. Ніхто
  2. KeyPress: KeyChar = 'a'
  3. KeyUp: KeyCode = Ключі.A

Але якщо натиснути Shift+ A, ви отримаєте:

  1. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, модифікатори = Keys.Shift
  2. KeyDown: KeyCode = Ключі.A, KeyData = Ключі.A | Клавіші.Shift, модифікатори = Keys.Shift
  3. KeyPress: KeyChar = 'A'
  4. KeyUp: KeyCode = Ключі.A
  5. KeyUp: KeyCode = Keys.ShiftKey

Якщо деякий час утримувати клавіші, ви отримаєте щось на зразок:

  1. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, модифікатори = Keys.Shift
  2. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, модифікатори = Keys.Shift
  3. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, модифікатори = Keys.Shift
  4. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, модифікатори = Keys.Shift
  5. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, модифікатори = Keys.Shift
  6. KeyDown: KeyCode = Ключі.A, KeyData = Ключі.A | Клавіші.Shift, модифікатори = Keys.Shift
  7. KeyPress: KeyChar = 'A'
  8. KeyDown: KeyCode = Ключі.A, KeyData = Ключі.A | Клавіші.Shift, модифікатори = Keys.Shift
  9. KeyPress: KeyChar = 'A'
  10. KeyDown: KeyCode = Ключі.A, KeyData = Ключі.A | Клавіші.Shift, модифікатори = Keys.Shift
  11. KeyPress: KeyChar = 'A'
  12. KeyDown: KeyCode = Ключі.A, KeyData = Ключі.A | Клавіші.Shift, модифікатори = Keys.Shift
  13. KeyPress: KeyChar = 'A'
  14. KeyDown: KeyCode = Ключі.A, KeyData = Ключі.A | Клавіші.Shift, модифікатори = Keys.Shift
  15. KeyPress: KeyChar = 'A'
  16. KeyUp: KeyCode = Ключі.A
  17. 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 за повтор.


2
Відмінне пояснення, thx, одна застереження, хоча Escape не запускає KeyPress в Chrome (не впевнений в інших).
— Барні

3
@BarnabasSzabolcs: Chrome працює .NET?
— P тато

@PDaddy ups, я не помітив, я вважав, що це javascript: D, але зі злегка дивним стилем: P все-таки, здається, правила дуже схожі: DD ... досить смішно, ця відповідь мені дуже допомогла. . ура:
— Барні

@PDaddy Я знаю, що принаймні Tab не запускає KeyDown або KeyUp за замовчуванням
— PsychoData

@PsychoData: Це тому, що клавіша Tab змінює фокус, тому не обробляється як вхід. Якщо ви переосмислите ProcessDialogKeyі повернете помилкове значення, коли keyDataце Keys.Tabабо Keys.Shift | Keys.Tab, тоді ви побачите клавішу Tab в клавіші (On) (Вниз | Натисніть | Вгору).
— П тато

73

Подія KeyPress не піднімається нехарактерними клавішами; однак, нехарактерні клавіші дійсно викликають події KeyDown та KeyUp.

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


17
Більшість інших відповідей так чи інакше неправильні, але ця наближається до реальності. KeyPress піднімається лише для символьних клавіш, і він підкоряється налаштуванню затримок / повторень набору клавіатури. Фактична послідовність подій: 1) KeyDown 2) для символьної клавіші KeyPress один чи декілька разів (залежно від системних налаштувань та часу, на який утримується клавіша) 3) KeyUp
— Filip Navara

У мене немає представника, щоб це зробити, але хтось може переламати вікі та поєднати зміст вищезазначеного коментаря та прийняту відповідь?
— Джош Кодрофф

11
Коментар Філіпа Навари не зовсім коректний. Якщо натиснути клавішу, ви отримаєте KeyDown, KeyPress, KeyDown, KeyPress, KeyDown, KeyPress KeyUp. KeyDown викликається для кожного повтору.
— P тато

9

KeyPress запускається тільки символами для друку та запускається після події KeyDown. Залежно від налаштувань затримки введення тексту може бути декілька подій KeyDown та KeyPress, але лише одна KeyUp подія.

KeyDown
KeyPress
KeyUp


Ви близькі, але з приводу послідовності.
— P тато

@P Daddy - я виправив це, повинен був двічі перевірити, перш ніж вийти з пам'яті.
— stevehipwell

@ Stevo3000, fyi: символи Unicode, які не можна друкувати, також запускають події KeyPress. У мене є додаток, який зчитує дані, вставлені зчитувачем штрих-кодів у текстове поле, і в програму зчитування входять символи unicode, які не можна друкувати.
— Jeff LaFay

@jlafay - Не відповідно до MSDN Подія KeyPress не піднімається нехарактерними клавішами; однак, нехарактерні клавіші дійсно викликають події KeyDown та KeyUp.
— stevehipwell

@ Stevo3000, я не впевнений, як сканер штрих-коду вводить текст у текстове поле, але KeyPress спрацьовує для спеціальних символів, які він надсилає. Значення починається з недрукуваного символу і закінчується символом, який не друкується. Тож я не впевнений, як це стріляти, якщо це правда. Можливо, я погляну на збірку .Net, яка містить події з IL Spy, щоб краще зрозуміти, що насправді виявлено.
— Jeff LaFay

5

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


4

Від MSDN:

Ключові події відбуваються у такому порядку:

  1. KeyDown

  2. KeyPress

  3. KeyUp

Крім того, KeyPress надає вам можливість оголосити дію як " оброблювану ", щоб не допустити нічого робити.


FYI, KeyDown та KeyUp також мають властивість Handled, яку ви можете встановити так, що це не між KeyPress та іншими ключовими подіями.
— Jeff LaFay

FWIW, хоча KeyUp, як і KeyDown, отримує параметр KeyEventArgs, його Handledвластивість не працює для KeyUp ( SuppressKeyPressтакож не працює).
— JonP


3

Клавіатура натискає клавішу, не відпускаючи її, клавіша - це повний цикл натискання та випуску.

По-іншому, KeyDown + KeyUp = Keypress


3
Відповідно до MSDN, послідовність подій - це KeyDown, KeyPress, KeyUp ( msdn.microsoft.com/en-us/library/… )
— Натан Кооп

@RobCowell Також, як вказував jlafay, KeyPress взагалі не залежить від KeyDown або KeyUp.
— PsychoData

1

Від розробника блогів :

Щоб зрозуміти різницю між клавіатурою та натисканням клавіші, корисно зрозуміти різницю між "символом" і "клавішею" . «Ключ» є фізичною кнопкою на клавіатурі комп'ютера в той час як «символ» є символ набраний натисканням кнопки. Теоретично події клавіш і клавіш являють собою клавіші, які натискаються або відпускаються, тоді як подія натискання клавіші являє собою символ, який вводиться. Реалізація теорії однакова у всіх браузерах.

Примітка. Ви також можете спробувати тестер ключових подій (доступний на вищезгаданому сайті), щоб зрозуміти цю концепцію.


1

KEYUP буде захоплено лише один раз, після відпуску натиснутої клавіші, незалежно від того, як довго буде утримуватися клавіша, тому якщо ви хочете зафіксувати такий натиск лише один раз, KEYUP є підходящим заходом для зйомки.


KeyPressПодія виникає для кожного символу , що генерується від входу, як у відповідь на преси фізичних ключовими, а також , коли персонаж є результатом функції автоповтора. Як працює введення клавіатури, документує цю поведінку.
— Неочікуваний

Ти правий. Я оновлю свою відповідь. Правильна відповідь - використовувати KEYUP, який буде запущений один раз, після виходу одного або декількох ключових хітів.
— Майкл Хефраті

Хоча більше не помиляється, він все ще не відповідає на запитання, яке було задано. Це не корисно.
— Неочікувана

0

Найпростіше пояснення:

Я затримав кнопку "d" на секунду, а потім відпустив.

дддддд

подія клавіші траплялася один раз до появи на екрані першого d, подія натискання клавіші сталася 6 разів, а подія клавіатури траплялася після того, як на екрані з'явився останній d.


чорт, неправильно прочитав це питання, і мені це вдалося в голову, він мав на увазі javascript
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.