Es gibt anscheinend viele Missverständnisse darüber!
Der einzige praktische Unterschied zwischen KeyDown
und KeyPress
besteht darin, dass KeyPress
das aus einem Tastendruck resultierende Zeichen weitergeleitet wird und nur aufgerufen wird, wenn es eines gibt.
Mit anderen Worten, wenn Sie Aauf Ihrer Tastatur drücken , erhalten Sie diese Abfolge von Ereignissen:
- KeyDown: KeyCode = Keys.A, KeyData = Keys.A, Modifiers = Keys.None
- KeyPress: KeyChar = 'a'
- KeyUp: KeyCode = Keys.A
Wenn Sie jedoch Shift+ drücken A, erhalten Sie:
- 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
Wenn Sie die Tasten eine Weile gedrückt halten, erhalten Sie Folgendes:
- 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
Beachten Sie, dass KeyPress
tritt dazwischen KeyDown
und KeyUp
, nicht nach dem KeyUp
, wie viele der anderen Antworten haben erklärt, dass KeyPress
nicht aufgerufen wird , wenn ein Zeichen nicht erzeugt wird, und dass KeyDown
wiederholt wird , während die Taste gedrückt gehalten wird , auch im Gegensatz zu vielen der anderen Antworten .
Beispiele für Schlüssel, die nicht direkt zu Aufrufen führen KeyPress
:
- Shift, Ctrl,Alt
- F1 durch F12
- Pfeiltasten
Beispiele für Schlüssel, die zu Aufrufen führen KeyPress
:
- Adurch Z, 0durch 9usw.
- Spacebar
- Tab (KeyChar = '\ t', ASCII 9)
- Enter (KeyChar = '\ r', ASCII 13)
- Esc (KeyChar = '\ x1b', ASCII 27)
- Backspace (KeyChar = '\ b', ASCII 8)
Für die Neugierigen KeyDown
korreliert grob mit WM_KEYDOWN
, KeyPress
zu WM_CHAR
und KeyUp
zu WM_KEYUP
. WM_KEYDOWN
kann als weniger als die Anzahl der Schlüsselwiederholungen bezeichnet werden, sendet jedoch eine Wiederholungsanzahl, mit der WinForms nach IIRC genau einen KeyDown pro Wiederholung generiert.
ProcessDialogKey
und false zurückgeben, wennkeyData
isKeys.Tab
oder istKeys.Shift | Keys.Tab
, wird die Tabulatortaste in der Taste (On) angezeigt (Down | Press | Up).Das KeyPress-Ereignis wird nicht durch Nichtzeichentasten ausgelöst. Die Nicht-Zeichen-Schlüssel lösen jedoch die Ereignisse KeyDown und KeyUp aus.
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress.aspx
quelle
KeyPress wird nur von druckbaren Zeichen ausgelöst und wird nach dem KeyDown-Ereignis ausgelöst. Abhängig von den Einstellungen für die Schreibverzögerung können mehrere KeyDown- und KeyPress-Ereignisse, jedoch nur ein KeyUp-Ereignis auftreten.
KeyDown
KeyPress
KeyUp
quelle
KeyPress ist eine höhere Abstraktionsebene als KeyDown (und KeyUp). KeyDown und KeyUp sind hardwarebezogen: die tatsächliche Aktion einer Taste auf der Tastatur. KeyPress ist mehr "Ich habe ein Zeichen von der Tastatur erhalten".
quelle
Von MSDN:
Darüber hinaus können Sie mit KeyPress die Aktion als " behandelt " deklarieren , um zu verhindern, dass sie etwas unternimmt.
quelle
Handled
Eigenschaft für KeyUp nicht funktionsfähig (SuppressKeyPress
ist auch nicht funktionsfähig).Ich habe immer gedacht, dass Keydown passiert, sobald Sie die Taste drücken. Beim Drücken der Taste wird die Taste gedrückt und losgelassen.
Ich fand dies, was eine etwas andere Erklärung gibt: http://bytes.com/topic/net/answers/649131-difference-keypress-keydown-event
quelle
Keydown drückt die Taste, ohne sie loszulassen. Keypress ist ein vollständiger Druck- und Freigabezyklus.
Anders ausgedrückt: KeyDown + KeyUp = Tastendruck
quelle
Vom Blogging-Entwickler :
Um den Unterschied zwischen Tastendruck und Tastendruck zu verstehen, ist es hilfreich, den Unterschied zwischen einem "Zeichen" und einer "Taste" zu verstehen . Eine "Taste" ist eine physische Taste auf der Tastatur des Computers, während ein "Zeichen" ein Symbol ist, das durch Drücken einer Taste eingegeben wird. Theoretisch stellen die Keydown- und Keyup-Ereignisse Tasten dar , die gedrückt oder losgelassen werden, während das Tastendruckereignis ein eingegebenes Zeichen darstellt . Die Implementierung der Theorie ist nicht in allen Browsern gleich.
Hinweis: Sie können auch den Key Event Tester (verfügbar auf der oben genannten Website) ausprobieren, um dieses Konzept zu verstehen.
quelle
KEYUP wird nur einmal erfasst, wenn die Taste gedrückt wird, unabhängig davon, wie lange die Taste gedrückt gehalten wird. Wenn Sie also einen solchen Druck nur einmal erfassen möchten, ist KEYUP das geeignete Ereignis zum Erfassen.
quelle
KeyPress
Ereignis wird für jedes aus der Eingabe erzeugte Zeichen ausgelöst, sowohl als Reaktion auf physische Tastendrücke als auch wenn das Zeichen das Ergebnis der automatischen Wiederholungsfunktion ist. Funktionsweise der Tastatureingabe dokumentiert dieses Verhalten.Einfachste Erklärung:
Ich hielt die 'd'-Taste eine Sekunde lang gedrückt und ließ sie dann los.
dddddd
Das Keydown-Ereignis ereignete sich einmal, bevor das erste d auf dem Bildschirm angezeigt wurde, das Tastendruckereignis 6 Mal und das Keyup-Ereignis, nachdem das letzte d auf dem Bildschirm angezeigt wurde.
quelle