Tampaknya ada banyak kesalahpahaman tentang ini!
Satu-satunya perbedaan praktis antara KeyDown
dan KeyPress
adalah KeyPress
relay karakter yang dihasilkan dari penekanan tombol, dan hanya dipanggil jika ada.
Dengan kata lain, jika Anda menekan Apada keyboard Anda, Anda akan mendapatkan urutan kejadian ini:
- KeyDown: KeyCode = Keys.A, KeyData = Keys.A, Pengubah = Keys.None
- KeyPress: KeyChar = 'a'
- KeyUp: KeyCode = Keys.A
Tetapi jika Anda menekan Shift+ A, Anda akan mendapatkan:
- KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Pengubah = 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
Jika Anda menahan tombol untuk sementara waktu, Anda akan mendapatkan sesuatu seperti:
- KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Pengubah = Keys.Shift
- KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Pengubah = Keys.Shift
- KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Pengubah = Keys.Shift
- KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Pengubah = Keys.Shift
- KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Pengubah = 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
Perhatikan bahwa KeyPress
terjadi di antara KeyDown
dan KeyUp
, bukan setelah KeyUp
, seperti banyak jawaban lain telah menyatakan, itu KeyPress
tidak disebut ketika karakter tidak dihasilkan, dan itu KeyDown
diulang ketika kunci ditekan, juga bertentangan dengan banyak jawaban lainnya .
Contoh kunci yang tidak secara langsung menghasilkan panggilan ke KeyPress
:
- Shift, Ctrl,Alt
- F1 melalui F12
- Tombol panah
Contoh kunci yang melakukan mengakibatkan panggilan ke KeyPress
:
- Amelalui Z, 0melalui 9, dll.
- Spacebar
- Tab (KeyChar = '\ t', ASCII 9)
- Enter (KeyChar = '\ r', ASCII 13)
- Esc (KeyChar = '\ x1b', ASCII 27)
- Backspace (KeyChar = '\ b', ASCII 8)
Untuk yang penasaran, secara KeyDown
kasar berkorelasi dengan WM_KEYDOWN
, KeyPress
untuk WM_CHAR
, dan KeyUp
untuk WM_KEYUP
. WM_KEYDOWN
dapat disebut lebih sedikit dari jumlah pengulangan kunci, tetapi mengirimkan jumlah pengulangan, yang, IIRC, menggunakan WinForms untuk menghasilkan tepat satu KeyDown per pengulangan.
ProcessDialogKey
dan kembali palsu saatkeyData
iniKeys.Tab
atauKeys.Shift | Keys.Tab
, maka Anda akan melihat tombol Tab di (On) Key (Bawah | Tekan | Up).Acara KeyPress tidak dimunculkan oleh tombol bukan karakter; Namun, kunci noncharacter meningkatkan peristiwa KeyDown dan KeyUp.
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress.aspx
sumber
KeyPress hanya diaktifkan oleh karakter yang dapat dicetak dan dipecat setelah acara KeyDown. Bergantung pada pengaturan penundaan pengetikan, mungkin ada beberapa acara KeyDown dan KeyPress tetapi hanya satu acara KeyUp.
KeyDown
KeyPress
KeyUp
sumber
KeyPress adalah tingkat abstraksi yang lebih tinggi daripada KeyDown (dan KeyUp). KeyDown dan KeyUp terkait dengan perangkat keras: tindakan sebenarnya dari tombol pada keyboard. KeyPress lebih "Saya menerima karakter dari keyboard".
sumber
Dari MSDN:
Selanjutnya, KeyPress memberi Anda kesempatan untuk menyatakan tindakan sebagai " ditangani " untuk mencegahnya melakukan apa pun.
sumber
Handled
propertinya tidak beroperasi untuk KeyUp (SuppressKeyPress
juga tidak beroperasi).Saya selalu berpikir keydown terjadi segera setelah Anda menekan tombol ke bawah, penekanan tombol adalah tindakan menekan tombol dan melepaskannya.
saya menemukan ini yang memberikan penjelasan yang sedikit berbeda: http://bytes.com/topic/net/answers/649131-difference-keypress-keydown-event
sumber
Keydown menekan tombol tanpa melepaskannya, Keypress adalah siklus tekan-dan-lepas yang lengkap.
Dengan kata lain, KeyDown + KeyUp = Keypress
sumber
Dari Pengembang Blogging :
Untuk memahami perbedaan antara penekanan tombol dan penekanan tombol, penting untuk memahami perbedaan antara "karakter" dan "kunci" . Sebuah "kunci" adalah tombol fisik pada keyboard komputer sementara "karakter" adalah simbol diketik dengan menekan sebuah tombol. Secara teori, peristiwa keydown dan keyup mewakili tombol yang ditekan atau dilepaskan, sedangkan peristiwa penekanan tombol mewakili karakter yang sedang diketik. Implementasi teori tidak sama di semua browser.
Catatan: Anda juga dapat mencoba Key Event Tester (tersedia di situs yang disebutkan di atas) untuk memahami konsep ini.
sumber
KEYUP akan ditangkap hanya satu kali, setelah tombol dilepas, terlepas dari berapa lama tombol akan ditekan, jadi jika Anda ingin menangkap pers hanya sekali, KEYUP adalah acara yang cocok untuk ditangkap.
sumber
KeyPress
event yang dibangkitkan untuk setiap karakter yang dihasilkan dari input, baik dalam menanggapi penekanan tombol fisik maupun ketika karakter adalah hasil dari fitur autorepeat. Cara Input Keyboard Bekerja mendokumentasikan perilaku ini.Penjelasan termudah:
Saya menekan tombol 'd' sebentar dan kemudian dirilis.
dddddd
peristiwa keydown terjadi satu kali sebelum d pertama muncul di layar, peristiwa penekanan tombol terjadi 6 kali dan peristiwa keyup terjadi setelah d terakhir muncul di layar.
sumber