web-dev-qa-db-ja.com

Visual StudioのKeyDownイベント、KeyPressイベント、KeyUpイベントの違い

KeyDownイベント、KeyPressイベント、KeyUpイベントの違いを教えてください。 msdnサイトを確認しましたが、あまり説明されていません。

各イベントが発生したときに誰もが簡単な論理的な意味で私に言うことができますか?上記のすべてのイベントは、キーが押されたときに発生すると感じています。それで、それらの正確な違いは何ですか。

57
reggie
  • KeyDown:ユーザーがキーを押すと発生します(キーボードがキーの指を最初に検出したとき、これはキーが押されたときに発生します)。

  • KeyPress:キーが押されてから離されると発生します。

  • KeyUp:キーが放されると発生します

これらのすべてのイベントは、キーを押してから放したときに、上記の順序で発生するのは正しいことです。

60
Roy T.

MSDNドキュメント は、3つのイベントが発生する順序をかなり明確に示しています。

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

  1. キーダウン
  2. キープレス
  3. キーアップ

KeyDown は、ユーザーがキーボードのキーを押すとすぐに発生します。それを押したままにします。

KeyPress は、characterキーに対して(ただし、 KeyDownおよびKeyUpは、キーが押されている間に非文字キーに対しても発生します)。これはKeyDownまたはKeyUpよりも「高レベル」のイベントであり、そのため、EventArgsで異なるデータを使用できます。

KeyUp は、ユーザーがキーボードのキーを放した後に発生します。

通常、アプリケーションでKeyUpイベントを処理する必要があります。ユーザーがキーを放すafterまで、UIでアクションを開始しないでください。 KeyUpKeyPressよりも低レベルのイベントであるため、押されたキーに関する情報が常に手元にあり、非文字の処理にも役立ちます。キー。


ただし、これらのイベントのallについて注意すべきことは、フォーカスを持っているコントロールによってのみ発生することです。つまり、フォーム上のボタンコントロールに現在フォーカスがある場合、formのキーイベントは一切発生しません。これは、.NETを初めて使用するプログラマにとってしばしば混乱を招きます。これを処理する最良の方法は、フォームの ProcessCmdKey method をオーバーライドすることです。

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == (Keys.Control | Keys.A))
    {
        MessageBox.Show("You pressed Ctrl+A!");
    }
    return base.ProcessCmdKey(ref msg, keyData);
}
74
Cody Gray

KeyUpを使用したくない場合は次のとおりです。

リストボックスがあり、行でEnterキーを押すと、エディターダイアログが起動します。問題:ユーザーがエディターの[OK]ボタンでEnterキーを押すと、KeyUp(e.KeyCode = Enter)イベントがリストボックスにリークし、エディターが再び開きます。これは、ユーザーがエディターの[OK]ボタンのスペースバーを押した場合には発生しません。その場合、KeyUp(e.KeyCode = Space)イベントはエディターが閉じる前に処理されます。

私が使用する選択ヒューリスティックは次のとおりです。

If I'm handling the Enter key and I need to guard against a case like the one above
  then I use KeyDown    
Else if I'm handling key combinations (e.g. CTRL+C)
   then I favor* KeyDown (KeyUp can make these awkward)   
Else if I am allowing press & hold autorepeat
  then I use KeyDown    
Else 
  I use KeyUp

*アクションが一般的に使用される製品、たとえばCtrl + A(「すべて選択」)などのMicrosoft Officeで実行できるものである場合、Microsoftの動作を模倣します。ユーザーが慣れているからです。

7
Jim C

KeyDown then KeyPress then KeyUpは、私が見つけた順序です。

通常、Shiftキーを押しながらクリックする場合のように、ユーザーがコントロールキーモードを変更してマルチモード入力用のキーを押しているアプリケーションの場合、KeyDownをフックします。 KeyPressは、単純なキー入力タイプのロジック用で、キーストロークを取得するだけです。 KeyUpは、メインのKeyPressロジックが有効になった後にテキスト編集ボックスの内容を変更するなど、他の何かがKeyPressを処理した後に実行されるロジックにフックされます。率直に言って、私はKeyUpをあまり使いませんが、時にはそれが他の何かがKeyPressを処理した後にメッセージを取得する唯一の方法であり、何が起こったかをチェック/修正する必要があります。

2
Christo

他の回答に加えて:

これらのイベントのどれにアクションを接続するべきかを考えようとするとき、キーが押されている間にKeyDownイベントが発生することに注意してください複数回。この動作が必要な場合もあれば、そうでない場合もあります。それに基づいて、(私の経験に基づいて)次の使用方法を提案します。

(イベントが発生する順序)

キーダウン

発生:キーが押されている間
使用法:ボタンを押すとすぐにアクションを実行します。
例:矢印キーでカーソルを移動

キープレス

発生:文字キーが押されました(高レベルのイベント)
使用法:タイピング関連
例:テキストボックス入力の処理

キーアップ

発生:キーが解放されます
使用法:キーストロークごとに1回だけ発生する必要のあるクリティカルアクションを実行
例:データをファイルに書き込む

1
marsze