Sự khác biệt giữa KeyDown và KeyPress trong .NET là gì?


185

Sự khác biệt giữa KeyDownKeyPresssự kiện trong là .netgì?

Câu trả lời:


307

Rõ ràng có rất nhiều hiểu lầm về điều này!

Sự khác biệt thực tế duy nhất giữa KeyDownKeyPressKeyPress chuyển tiếp ký tự kết quả từ một phím bấm và chỉ được gọi nếu có.

Nói cách khác, nếu bạn nhấn Atrên bàn phím, bạn sẽ nhận được chuỗi sự kiện này:

  1. KeyDown: KeyCode = Keys.A, KeyData = Keys.A, Modifier = Keys.None
  2. Phím bấm: KeyChar = 'a'
  3. KeyUp: KeyCode = Keys.A

Nhưng nếu bạn nhấn Shift+ A, bạn sẽ nhận được:

  1. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modifier = Keys.Shift
  2. KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Phím.Shift, Modifier = Keys.Shift
  3. Phím bấm: KeyChar = 'A'
  4. KeyUp: KeyCode = Keys.A
  5. KeyUp: KeyCode = Keys.ShiftKey

Nếu bạn giữ phím trong một thời gian, bạn sẽ nhận được một cái gì đó như:

  1. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modifier = Keys.Shift
  2. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modifier = Keys.Shift
  3. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modifier = Keys.Shift
  4. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modifier = Keys.Shift
  5. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modifier = Keys.Shift
  6. KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Phím.Shift, Modifier = Keys.Shift
  7. Phím bấm: KeyChar = 'A'
  8. KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Phím.Shift, Modifier = Keys.Shift
  9. Phím bấm: KeyChar = 'A'
  10. KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Phím.Shift, Modifier = Keys.Shift
  11. Phím bấm: KeyChar = 'A'
  12. KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Phím.Shift, Modifier = Keys.Shift
  13. Phím bấm: KeyChar = 'A'
  14. KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Phím.Shift, Modifier = Keys.Shift
  15. Phím bấm: KeyChar = 'A'
  16. KeyUp: KeyCode = Keys.A
  17. KeyUp: KeyCode = Keys.ShiftKey

Lưu ý rằng KeyPressxảy ra ở giữa KeyDownKeyUp, không phải sau đó KeyUp, như nhiều câu trả lời khác đã nêu, KeyPresskhông được gọi khi một ký tự không được tạo và đó làKeyDown được lặp lại trong khi phím được giữ, cũng trái với nhiều câu trả lời khác .

Ví dụ về các khóa không trực tiếp dẫn đến các cuộc gọi đến KeyPress:

  • Shift, Ctrl,Alt
  • F1 xuyên qua F12
  • Phím mũi tên

Ví dụ về các phím đó làm kết quả trong các cuộc gọi đến KeyPress:

  • Athông qua Z, 0thông qua 9, vv
  • Spacebar
  • Tab (KeyChar = '\ t', ASCII 9)
  • Enter (KeyChar = '\ r', ASCII 13)
  • Esc (KeyChar = '\ x1b', ASCII 27)
  • Backspace (KeyChar = '\ b', ASCII 8)

Đối với người hiếu, KeyDownđại khái tương quan với WM_KEYDOWN, KeyPressđể WM_CHAR, và KeyUpđể WM_KEYUP. WM_KEYDOWN có thể được gọi ít hơn số lần lặp lại khóa, nhưng nó sẽ gửi số đếm lặp lại, mà IIRC, WinForms sử dụng để tạo chính xác một KeyDown mỗi lần lặp lại.


2
Giải thích tuyệt vời, tuy nhiên, một cảnh báo, Escape không kích hoạt KeyPress trên Chrome (không chắc chắn về những cái khác).
Barney

3
@BarnabasSzabolcs: Chrome chạy .NET?
P Daddy

@PDaddy up, tôi đã bỏ qua, tôi đã nghĩ đó là javascript: D nhưng với phong cách hơi kỳ lạ: P tuy nhiên, có vẻ như các quy tắc khá giống nhau: DD ... thật vui là câu trả lời này đã giúp tôi rất nhiều .. chúc mừng :)
Barney

@PDaddy Tôi biết rằng ít nhất Tab không kích hoạt KeyDown hoặc KeyUp theo mặc định
PsychoData

@PologistsoData: Đó là vì phím Tab thay đổi trọng tâm, vì vậy nó không được xử lý làm đầu vào. Nếu bạn ghi đè ProcessDialogKeyvà trả về sai khi keyDataKeys.Tabhoặc Keys.Shift | Keys.Tab, thì bạn sẽ thấy phím Tab trong Phím (Bật) (Xuống | Nhấn | Lên).
P Daddy

73

Sự kiện KeyPress không được đưa ra bởi các khóa không phải là vi khuẩn; tuy nhiên, các khóa không phải là vi khuẩn làm tăng các sự kiện KeyDown và KeyUp.

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


17
Hầu hết các câu trả lời khác đều sai theo cách này hay cách khác, nhưng câu trả lời này gần nhất với thực tế. KeyPress chỉ được nâng lên cho các phím ký tự và nó tuân theo cài đặt độ trễ / lặp lại gõ bàn phím. Chuỗi sự kiện thực tế là: 1) KeyDown 2) cho khóa ký tự KeyPress một hoặc nhiều lần (tùy thuộc vào cài đặt hệ thống và thời gian giữ phím) 3) KeyUp
Filip Navara

Tôi không có đại diện để làm điều đó, nhưng ai đó có thể phá vỡ wiki và kết hợp nội dung của nhận xét trên và câu trả lời được chấp nhận không?
Josh Kodroff

11
Nhận xét của Filip Navara không hoàn toàn chính xác. Nếu một phím được giữ, bạn sẽ nhận được KeyDown, KeyPress, KeyDown, KeyPress, KeyDown, KeyPress KeyUp. KeyDown được gọi cho mỗi lần lặp lại.
P Daddy

9

KeyPress chỉ được kích hoạt bởi các ký tự có thể in và được kích hoạt sau sự kiện KeyDown. Tùy thuộc vào cài đặt độ trễ gõ, có thể có nhiều sự kiện KeyDown và KeyPress nhưng chỉ có một sự kiện KeyUp.

KeyDown
KeyPress
KeyUp


Bạn đang ở gần, nhưng tắt về trình tự.
P Daddy

@P Daddy - Tôi đã sửa nó, nên kiểm tra lại trước khi đi từ bộ nhớ.
stevehipwell

@ Stevo3000, fyi: các ký tự unicode không in được cũng sẽ kích hoạt các sự kiện KeyPress. Tôi có một ứng dụng đọc dữ liệu được chèn bởi đầu đọc mã vạch vào hộp văn bản và đầu đọc bao gồm các ký tự unicode không in được.
Jeff LaFay

@jlafay - Không theo MSDN Sự kiện KeyPress không được đưa ra bởi các khóa không phải là vi khuẩn; tuy nhiên, các khóa không phải là vi khuẩn làm tăng các sự kiện KeyDown và KeyUp.
stevehipwell

@ Stevo3000, tôi không chắc chắn cách máy quét mã vạch nhập văn bản vào hộp văn bản nhưng KeyPress kích hoạt các ký tự đặc biệt mà nó gửi. Giá trị bắt đầu bằng ký tự không in được và kết thúc bằng ký tự không in được. Vì vậy, tôi không chắc nó bắn như thế nào nếu đó là sự thật. Có lẽ tôi sẽ xem xét hội đồng .Net có chứa các sự kiện với IL Spy để có cái nhìn rõ hơn về những gì thực sự được phát hiện.
Jeff LaFay

5

KeyPress là mức độ trừu tượng cao hơn KeyDown (và KeyUp). KeyDown và KeyUp có liên quan đến phần cứng: hành động thực tế của một phím trên bàn phím. KeyPress là "Tôi đã nhận được một ký tự từ bàn phím".


4

Từ MSDN:

Các sự kiện chính xảy ra theo thứ tự sau:

  1. KeyDown

  2. Bàn phím

  3. KeyUp

Hơn nữa, KeyPress cho bạn cơ hội tuyên bố hành động là "đã xử lý " để ngăn hành động đó làm bất cứ điều gì.


FYI, KeyDown và KeyUp cũng có thuộc tính Handled mà bạn có thể đặt để không phải là giữa KeyPress và các sự kiện quan trọng khác.
Jeff LaFay

FWIW mặc dù KeyUp, như KeyDown, nhận được tham số KeyEventArss, thuộc tính của nó Handledkhông hoạt động đối với KeyUp ( SuppressKeyPresscũng không hoạt động).
JonP


3

Keydown đang nhấn phím mà không giải phóng nó, Keypress là một chu trình nhấn và phát hành hoàn chỉnh.

Nói cách khác, KeyDown + KeyUp = Nhấn phím


3
Theo MSDN, chuỗi sự kiện là KeyDown, KeyPress, KeyUp ( msdn.microsoft.com/en-us/l Library / trộm )
Nathan Koop

@RobCowell Ngoài ra, như jlafay đã chỉ ra KeyPress hoàn toàn không phụ thuộc vào KeyDown hoặc KeyUp.
PsychoData

1

Từ nhà phát triển blog :

Để hiểu được sự khác biệt giữa phím tắt và phím bấm, rất hữu ích để hiểu sự khác biệt giữa "ký tự""phím" . Một "chìa khóa" là một nút vật lý trên bàn phím của máy tính, trong khi một "nhân vật" là một biểu tượng gõ bằng cách nhấn một nút. Về lý thuyết, các sự kiện keydown và keyup đại diện cho các phím được nhấn hoặc phát hành, trong khi sự kiện nhấn phím đại diện cho một ký tự được gõ. Việc thực hiện lý thuyết là không giống nhau trong tất cả các trình duyệt.

Lưu ý: Bạn cũng có thể dùng thử Key Event Tester (có sẵn trên trang web nói trên) để hiểu khái niệm này.


1

KEYUP sẽ chỉ được ghi lại một lần, khi phát hành phím được nhấn, bất kể phím đó sẽ được giữ trong bao lâu, vì vậy nếu bạn muốn chụp như vậy chỉ một lần, KEYUP là sự kiện phù hợp để chụp.


Sự KeyPresskiện này được nêu ra cho mọi ký tự được tạo từ đầu vào, cả khi phản ứng với các lần nhấn phím vật lý cũng như khi ký tự là kết quả của tính năng autorepeat. Làm thế nào Bàn phím Nhập hoạt động tài liệu hành vi này.
IInspectable

Bạn đúng rồi. Tôi sẽ cập nhật câu trả lời của tôi. Câu trả lời đúng là sử dụng KEYUP sẽ được kích hoạt một lần, khi phát hành một hoặc nhiều lần nhấn phím.
Michael Haephrati

Mặc dù không còn sai, nó vẫn không trả lời câu hỏi đã được hỏi. Điều này không hữu ích.
IInspectable

0

Giải thích dễ nhất:

Tôi giữ phím 'd' trong một giây rồi thả ra.

bánh bao

sự kiện keydown đã xảy ra một lần trước khi d đầu tiên xuất hiện trên màn hình, sự kiện nhấn phím đã xảy ra 6 lần và sự kiện keyup xảy ra sau khi d cuối cùng xuất hiện trên màn hình.


chết tiệt, đọc sai câu hỏi và đưa nó vào đầu tôi, anh ta có nghĩa là javascript
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.