.NETのKeyDownとKeyPressの違いは何ですか?


回答:


308

どうやらこれについて多くの誤解があります!

間の唯一の実用的な違いKeyDownとはKeyPressつまりKeyPressキープレスから結果の文字リレー、および1がある場合にのみ呼び出されます。

つまり、Aキーボードを押すと、次の一連のイベントが発生します。

  1. KeyDown:KeyCode = Keys.A、KeyData = Keys.A、Modifiers = Keys.None
  2. KeyPress:KeyChar = 'a'
  3. KeyUp:KeyCode = Keys.A

ただし、Shift+ を押すとA、次のようになります。

  1. KeyDown:KeyCode = Keys.ShiftKey、KeyData = Keys.ShiftKey、Shift、Modifiers = Keys.Shift
  2. KeyDown:KeyCode = Keys.A、KeyData = Keys.A | Keys.Shift、Modifiers = Keys.Shift
  3. KeyPress:KeyChar = 'A'
  4. KeyUp:KeyCode = Keys.A
  5. KeyUp:KeyCode = Keys.ShiftKey

キーをしばらく押し続けると、次のような結果が得られます。

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

お知らせKeyPress発生の間に KeyDown及びKeyUp、いない後のKeyUp他の回答の多くが述べたように、KeyPress文字が生成されていないときに呼び出されていない、そしてそれはKeyDown他の回答の多くに反しても、キーを押している間繰り返されます。

結果として直接呼び出されないキーの例KeyPress:

  • Shift、Ctrl、Alt
  • F1 使って F12
  • 矢印キー

キーの例ですへの呼び出しの結果KeyPress:

  • A経由など、Z09
  • 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 ことができますが、WinFormsが繰り返しごとに正確に1つのKeyDownを生成するために使用する繰り返しカウントを送信します。


2
素晴らしい説明ですが、1つ注意点がありますが、EscapeはChromeでKeyPressをトリガーしません(他についてはわかりません)。
— Barney

3
@BarnabasSzabolcs:Chromeは.NETを実行しますか?
— Pダディ

@PDaddy ups、私は見落としました、それはjavascript:Dだと思っていましたが、少し変なスタイル:Pですが、ルールは非常に似ているようです:DD ...おかしなことに、この回答はとにかく大いに役立ちました。 。cheers :)
— Barney

@PDaddy私は少なくともTabがデフォルトでKeyDownまたはKeyUpを起動しないことを知っています
— PsychoData

@PsychoData:Tabキーがフォーカスを変更するため、入力として処理されません。is またはのProcessDialogKeyときにオーバーライドしてfalseを返すと、(On)Key(Down | Press | Up)にTabキーが表示されます。keyDataKeys.TabKeys.Shift | Keys.Tab
— Pダディ

73

KeyPressイベントは、非文字キーでは発生しません。ただし、非文字キーはKeyDownイベントとKeyUpイベントを発生させます。

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


17
他のほとんどの答えは何らかの形で間違っていますが、これは現実に最も近いものです。KeyPressは文字キーに対してのみ発生し、キーボードの入力遅延/繰り返しの設定に従います。イベントの実際のシーケンスは次のとおりです。1)KeyDown 2)文字キーKeyPressを1回以上(システム設定とキーが保持される時間に応じて)3)KeyUp
— Filip

私にはそれを行う担当者がいませんが、誰かがウィキを破って、上​​記のコメントの内容と受け入れられた回答を組み合わせることができますか?
— ジョシュコドロフ

11
Filip Navaraのコメントは完全に正しくはありません。キーが押されている場合、KeyDown、KeyPress、KeyDown、KeyPress、KeyDown、KeyPress KeyUpを取得します。KeyDownは、繰り返しごとに呼び出されます。
— P Daddy

9

KeyPressは印刷可能な文字によってのみ発生し、KeyDownイベントの後に発生します。入力遅延の設定によっては、複数のKeyDownイベントとKeyPressイベントがありますが、KeyUpイベントは1つだけです。

KeyDown
KeyPress
KeyUp


あなたは近いですが、シーケンスについてはオフです。
— Pダディ

@Pダディ-私はそれを修正しました。メモリから移動する前に再確認する必要があります。
— stevehipwell

@ Stevo3000、fyi:印刷不可能なユニコード文字もKeyPressイベントを発生させます。バーコードリーダーによってテキストボックスに挿入されたデータを読み取るアプリがあり、リーダーに印刷できないユニコード文字が含まれています。
— Jeff LaFay 2013

@jlafay- MSDNに 準拠していないKeyPressイベントは
— stevehipwell 2013

@ Stevo3000、バーコードスキャナーがテキストボックスにテキストを入力する方法はわかりませんが、KeyPressが送信する特殊文字に対して起動します。値は、印刷できない文字で始まり、印刷できない文字で終わります。そのため、それが本当かどうかはわかりません。たぶん、IL Spyのイベントを含む.Netアセンブリを見て、実際に何が検出されているのかを詳しく調べます。
— Jeff LaFay 2013

5

KeyPressは、KeyDown(およびKeyUp)よりも高いレベルの抽象化です。KeyDownとKeyUpはハードウェアに関連しています:キーボードのキーの実際のアクション。KeyPressは「キーボードから文字を受け取った」という意味です。


4

MSDNから:

キーイベントは次の順序で発生します。

  1. KeyDown

  2. KeyPress

  3. KeyUp

さらに、KeyPressはアクションを「処理済み」として宣言して、何もしないようにする機会を提供します。


FYI、KeyDown、およびKeyUpにも、KeyPressと他のキーイベントの間ではないように設定できるHandledプロパティがあります。
— Jeff LaFay 2013

FWIWはKeyDownと同様に、KeyDownと同様にKeyEventArgsパラメータを取得しますが、そのHandledプロパティはKeyUpでは機能しません(機能しませんSuppressKeyPress)。
— JonP 2016年

3

キーを押すとすぐにキーダウンが発生すると思っていましたが、keypressはキーを押して離す操作です。

私はこれが少し異なる説明を与えることを発見しました:http ://bytes.com/topic/net/answers/649131-difference-keypress-keydown-event



1

ブログ開発者から:

keydownとkeypressの違いを理解するには、「文字」と「キー」の違いを理解すると役立ちます。「鍵は」ながら、コンピュータのキーボード上の物理的なボタンである「文字」は、ボタンを押すことによって入力されたシンボルです。理論的には、keydownイベントとkeyupイベントはキーが押されたり離されたりしたことを表し、keypressイベントは入力された文字を表します。理論の実装は、すべてのブラウザで同じというわけではありません。

注:この概念を理解するために、Key Event Tester(上記のサイトで入手可能)を試すこともできます。


1

KEYUPは、押されたキーを離したときに、キーが押されている時間に関係なく1回だけキャプチャされます。そのため、そのようなプレスを1回だけキャプチャする場合は、KEYUPがキャプチャに適したイベントです。


このKeyPressイベントは、入力から生成されたすべての文字に対して発生します。これは、物理的なキーを押したときの応答と、文字がオートリピート機能の結果であるときの両方です。キーボード入力の仕組みでは、この動作について説明しています。
— IInspectable 2018年

あなたが正しいです。回答を更新します。正解は、1つ以上のキーヒットのリリース時に1回トリガーされるKEYUPを使用することです。
— Michael Haephrati 2018年

もはや間違っているわけではありませんが、それでも質問された質問には答えません。これは役に立ちません。
— IInspectable 2018年

0

最も簡単な説明:

「d」キーをしばらく押してから離しました。

dddddd

keydownイベントは最初のdが画面に表示される前に1回発生し、keypressイベントは6回発生し、最後のdが画面に表示された後にkeyupイベントが発生しました。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.