.NET'te KeyDown ve KeyPress arasındaki fark nedir?


185

KeyDownVe içindeki KeyPressolaylar arasındaki fark nedir .net?

Yanıtlar:


308

Görünüşe göre bu konuda bir çok yanlış anlama var!

Arasındaki tek pratik fark KeyDownve KeyPressolmasıdır KeyPresskarakter Bir tuşa basıldıktan kaynaklanan röleleri ve eğer varsa sadece denir.

Başka bir deyişle, Aklavyenize basarsanız , bu olaylar dizisini alırsınız:

  1. KeyDown: KeyCode = Keys.A, KeyData = Keys.A, Değiştiriciler = Keys.None
  2. KeyPress: KeyChar = 'a'
  3. KeyUp: KeyCode = Keys.A

Ancak Shift+ tuşuna basarsanız Aşunları elde edersiniz:

  1. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Değiştiriciler = Keys.Shift
  2. KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Değiştiriciler = Keys.Shift
  3. KeyPress: KeyChar = 'A'
  4. KeyUp: KeyCode = Keys.A
  5. KeyUp: KeyCode = Keys.ShiftKey

Tuşları bir süre basılı tutarsanız, şöyle bir şey elde edersiniz:

  1. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Değiştiriciler = Keys.Shift
  2. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Değiştiriciler = Keys.Shift
  3. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Değiştiriciler = Keys.Shift
  4. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Değiştiriciler = Keys.Shift
  5. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Değiştiriciler = Keys.Shift
  6. KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Değiştiriciler = Keys.Shift
  7. KeyPress: KeyChar = 'A'
  8. KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Değiştiriciler = Keys.Shift
  9. KeyPress: KeyChar = 'A'
  10. KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Değiştiriciler = Keys.Shift
  11. KeyPress: KeyChar = 'A'
  12. KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Değiştiriciler = Keys.Shift
  13. KeyPress: KeyChar = 'A'
  14. KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Değiştiriciler = Keys.Shift
  15. KeyPress: KeyChar = 'A'
  16. KeyUp: KeyCode = Keys.A
  17. KeyUp: KeyCode = Keys.ShiftKey

Uyarı KeyPressoluşur aradaki KeyDown ve KeyUp, değil sonra KeyUp, diğer yanıtların pek belirttiğimiz gibi, bu KeyPressbir karakter oluşturulmaz çağrılan değildir ve bu KeyDownanahtar basılı tutulurken diğer cevapların birçoğu da, aksine tekrarlanır .

Do tuşları örnekleri değil , doğrudan yapılan çağrıların neden KeyPress:

  • Shift, Ctrl,Alt
  • F1 vasıtasıyla F12
  • Ok tuşları

Tuşların örnekleri yapmak için çağrılarda sonucu KeyPress:

  • Aiçinden Z, 0içinden 9vb.
  • Spacebar
  • Tab (KeyChar = '\ t', ASCII 9)
  • Enter (KeyChar = '\ r', ASCII 13)
  • Esc (KeyChar = '\ x1b', ASCII 27)
  • Backspace (KeyChar = '\ b', ASCII 8)

Meraklı için, KeyDownkabaca ilişkilidir WM_KEYDOWN, KeyPressiçin WM_CHAR, ve KeyUpiçin WM_KEYUP. WM_KEYDOWN olabilir anahtar tekrar sayısının daha az olarak adlandırılan, ancak IIRC, WinForms kullanımları tekrar başına tam olarak bir KeyDown oluşturmak için bir tekrar sayısı, gönderir edilebilir.


2
Mükemmel açıklama, thx, bir uyarı olsa da, Escape Chrome'da KeyPress'i tetiklemez (diğerlerinden emin değilim).
Barney

3
@BarnabasSzabolcs: Chrome .NET kullanıyor mu?
P Daddy

@PDaddy ups, göz ardı ettim, javascript: D olduğunu düşündüm ama biraz garip tarzı ile: P yine de, kurallar oldukça benzer görünüyor: DD ... ne kadar tuhaf bu cevap zaten bana çok yardımcı oldu .. Şerefe :)
Barney

@PDaddy En azından Tab'ın KeyDown veya
KeyUp'ı

@PsychoData: Bunun nedeni Sekme tuşunun odağı değiştirmesidir, bu nedenle girdi olarak işlenmez. Veya değerini geçersiz kılar ProcessDialogKeyve false keyDatadeğerini döndürürseniz , (On) Tuşu'nda (Aşağı | Basın | Yukarı) Sekme tuşunu görürsünüz. Keys.TabKeys.Shift | Keys.Tab
P Daddy

73

KeyPress olayı karakter olmayan anahtarlar tarafından yükseltilmez; ancak, karakter olmayan anahtarlar KeyDown ve KeyUp olaylarını artırır.

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


17
Diğer cevapların çoğu şu ya da bu şekilde yanlıştır, ancak bu gerçekliğe en yakın olanıdır. KeyPress yalnızca karakter tuşları için yükseltilir ve klavye yazma gecikmeleri / tekrarlama ayarlarına uyar. Olayların gerçek sırası şöyledir: 1) KeyDown 2) karakter tuşu KeyPress için bir veya daha fazla kez (sistem ayarlarına ve tuşun ne kadar süreyle tutulduğuna bağlı olarak) 3) KeyUp
Filip Navara

Bunu yapmak için temsilcim yok, ama birileri bir wiki büstü ve yukarıdaki yorumun içeriğini ve kabul edilen cevabı birleştirebilir mi?
Josh Kodroff

11
Filip Navara'nın yorumu tamamen doğru değil. Bir tuş basılı tutulursa, KeyDown, KeyPress, KeyDown, KeyPress, KeyDown, KeyPress KeyUp'ı alırsınız. KeyDown her tekrar için çağrılır.
P Daddy

9

KeyPress yalnızca yazdırılabilir karakterler tarafından tetiklenir ve KeyDown olayından sonra tetiklenir. Yazma gecikme ayarlarına bağlı olarak birden fazla KeyDown ve KeyPress olayı olabilir, ancak yalnızca bir KeyUp olayı olabilir.

KeyDown
KeyPress
KeyUp


Yakınsın, ama dizilim hakkında.
P Daddy

@P Daddy - Düzelttim, bellekten gitmeden önce iki kez kontrol etmeliydim.
stevehipwell

@ Stevo3000, fyi: yazdırılamayan unicode karakterler de KeyPress olaylarını tetikler. Bir metin kutusuna barkod okuyucu tarafından eklenen verileri okuyan bir uygulama var ve okuyucu yazdırılamayan unicode karakterler içeriyor.
Jeff LaFay

@jlafay - göre değil MSDN noncharacter tuşları tarafından gündeme etmiyor olabilir KeyPress olayı; ancak, karakter olmayan anahtarlar KeyDown ve KeyUp olaylarını artırır.
stevehipwell

@ Stevo3000, barkod tarayıcının bir metin kutusuna nasıl metin girdiğinden emin değilim ama KeyPress gönderdiği özel karakterler için ateş ediyor. Değer yazdırılamayan bir karakterle başlar ve yazdırılamayan bir karakterle sona erer. Bu yüzden, eğer doğru ise nasıl ateş ettiğinden emin değilim Belki gerçekte ne tespit edildiğini daha iyi görmek için IL Spy ile olayları içeren .Net derlemesine bir göz atacağım.
Jeff LaFay

5

KeyPress, KeyDown'dan (ve KeyUp'tan) daha yüksek bir soyutlama seviyesidir. KeyDown ve KeyUp donanımla ilgilidir: bir tuşun klavyedeki gerçek eylemi. KeyPress daha çok "Klavyeden bir karakter aldım".


4

MSDN'den:

Önemli olaylar aşağıdaki sırada gerçekleşir:

  1. KeyDown

  2. KeyPress

  3. KeyUp

Ayrıca, KeyPress herhangi bir şey yapmasını önlemek için eylemi " ele alındı " olarak bildirme şansı verir .


FYI, KeyDown ve KeyUp ayrıca, ayarlayabileceğiniz bir Handled özelliğine sahiptir, böylece KeyPress ve diğer önemli olaylar arasında bir değil.
Jeff LaFay

FWIW, KeyUp, KeyDown gibi bir KeyEventArgs parametresi alır, ancak Handledözelliği KeyUp için çalışmaz ( SuppressKeyPressayrıca çalışmaz).
JonP



1

Gönderen Blog Geliştirici :

Tuş basma ile tuşa basma arasındaki farkı anlamak için, bir "karakter" ile "tuş" arasındaki farkı anlamak yararlıdır . Bir "anahtar" bir süre bilgisayarın klavyesinde fiziksel düğme "karakteri" bir düğmeye basarak yazdığınız bir semboldür. Teoride, keydown ve keyup olayları basılan veya bırakılan tuşları temsil ederken, keypress olayı yazılan bir karakteri temsil eder . Teorinin uygulanması tüm tarayıcılarda aynı değildir.

Not: Bu kavramı anlamak için Ana Etkinlik Test Cihazını da (yukarıda belirtilen sitede bulunur) deneyebilirsiniz .


1

KEYUP, tuşun ne kadar süreyle basılı tutulacağına bakılmaksızın, tuşun bırakılmasından sonra yalnızca bir kez yakalanacaktır, bu nedenle bu tür bir baskıyı yalnızca bir kez yakalamak istiyorsanız, KEYUP yakalamak için uygun bir olaydır.


KeyPressEtkinlik, hem de karakter otomatik tekrar özelliği sonucu olduğu gibi fiziksel tuş basma yanıt olarak, girişten üretilen her bir karakter için yükseltilir. Klavye Girişi Nasıl Çalışır bu davranışı belgeler.
18'de

Haklısın. Cevabımı güncelleyeceğim. Doğru cevap, bir veya daha fazla anahtar isabetin serbest bırakılması üzerine bir kez tetiklenecek KEYUP'u kullanmaktır.
Michael Haephrati

Artık yanlış olmasa da, hala sorulan soruya cevap vermiyor. Bu yararlı değil.
18'de

0

En kolay açıklama:

'D' tuşunu bir saniye basılı tutup bıraktım.

DDDDDD

tuşa basma olayı ilk d ekranda görünmeden önce bir kez, tuşa basma olayı 6 kez ve tuşlanma olayı son d ekranda belirdikten sonra gerçekleşti.


lanet olsun, soruyu yanlış okudum ve kafamın içine var o javascript demek
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.