Windows フォームでは、ユーザー入力は Windows メッセージの形式でアプリケーションに送信されます。 一連のオーバーライド可能なメソッドは、アプリケーション、フォーム、および制御レベルでこれらのメッセージを処理します。 これらのメソッドは、キーボード メッセージを受信すると、キーボード入力に関する情報を取得するために処理できるイベントを発生させます。 多くの場合、Windows フォーム アプリケーションでは、これらのイベントを処理するだけで、すべてのユーザー入力を処理できます。 その他の場合、アプリケーションは、アプリケーション、フォーム、またはコントロールによって受信される前に、特定のメッセージをインターセプトするためにメッセージを処理するメソッドのいずれかをオーバーライドする必要があります。
キーボード イベント
すべての Windows フォーム コントロールは、マウスとキーボードの入力に関連する一連のイベントを継承します。 たとえば、コントロールは KeyPress イベントを処理して、押されたキーの文字コードを決定できます。 詳細については、「キーボード イベントの使用」を参照してください。
ユーザー入力メッセージを処理するメソッド
フォームとコントロールは、IMessageFilter インターフェイスと、メッセージ キュー内のさまざまなポイントで Windows メッセージを処理する一連のオーバーライド可能なメソッドにアクセスできます。 これらのメソッドはすべて、Windows メッセージの低レベルの詳細をカプセル化する Message パラメーターを持ちます。 これらのメソッドを実装またはオーバーライドしてメッセージを調べ、メッセージを使用するか、メッセージ キュー内の次のコンシューマーに渡すことができます。 次の表に、Windows フォーム内のすべての Windows メッセージを処理するメソッドを示します。
メソッド | 注記 |
---|---|
PreFilterMessage | このメソッドは、キューに置かれた (ポストされた) Windows メッセージをアプリケーション レベルでインターセプトします。 |
PreProcessMessage | このメソッドは、処理される前に、フォームおよびコントロール レベルで Windows メッセージをインターセプトします。 |
WndProc | このメソッドは、フォームおよびコントロール レベルで Windows メッセージを処理します。 |
DefWndProc | このメソッドは、フォームおよびコントロール レベルで Windows メッセージの既定の処理を実行します。 これにより、ウィンドウの最小限の機能が提供されます。 |
OnNotifyMessage | このメソッドは、処理された後、フォームおよびコントロール レベルでメッセージをインターセプトします。 このメソッドを呼び出すには、EnableNotifyMessage スタイル ビットを設定する必要があります。 |
キーボードとマウスのメッセージは、これらの種類のメッセージに固有のオーバーライド可能なメソッドの追加セットによって処理されます。 詳細については、「 キーの前処理 」セクションを参照してください。
キーの種類
Windows フォームでは、ビットごとの Keys 列挙型で表される仮想キー コードとしてキーボード入力が識別されます。 Keys列挙を使用すると、一連の押されたキーを組み合わせて 1 つの値にすることができます。 これらの値は、 WM_KEYDOWNおよびWM_SYSKEYDOWN Windows メッセージに付随する値 に 対応します。 KeyDownまたはKeyUpイベントを処理することで、ほとんどの物理キー押下を検出できます。 文字キーはKeys列挙体のサブセットであり、WM_CHARおよびWM_SYSCHAR Windows メッセージに付随する値に対応します。 押されたキーの組み合わせが文字になった場合は、 KeyPress イベントを処理して文字を検出できます。 または、Visual Basic プログラミング インターフェイスによって公開されている Keyboardを使用して、押されたキーを検出し、キーを送信することもできます。 詳細については、「 キーボードへのアクセス (Visual Basic)」を参照してください。
キーボード イベントの順序
前述のように、コントロールで発生する可能性がある 3 つのキーボード関連イベントがあります。 次のシーケンスは、イベントの一般的な順序を示しています。
- ユーザーが A キーをプッシュし、キーが前処理され、ディスパッチされ、 KeyDown イベントが発生します。
- ユーザーは A キーを保持し、キーが前処理され、ディスパッチされ、 KeyPress イベントが発生します。 このイベントは、ユーザーがキーを保持すると複数回発生します。
- ユーザーは A キーを解放し、キーが前処理され、ディスパッチされ、 KeyUp イベントが発生します。
キーの前処理
他のメッセージと同様に、キーボード メッセージはフォームまたはコントロールの WndProc メソッドで処理されます。 ただし、キーボード メッセージが処理される前に、 PreProcessMessage メソッドは、特殊文字キーと物理キーを処理するためにオーバーライドできる 1 つ以上のメソッドを呼び出します。 これらのメソッドをオーバーライドして、コントロールがメッセージを処理する前に特定のキーを検出してフィルター処理することができます。 次の表に、実行されているアクションと、発生する関連メソッドを、メソッドの順序で示します。
KeyDown イベントの前処理
アクション | 関連メソッド | 注記 |
---|---|---|
アクセラレータやメニュー ショートカットなどのコマンド キーを確認します。 | ProcessCmdKey | このメソッドは、通常のキーよりも優先されるコマンド キーを処理します。 このメソッドが true を返す場合、キー メッセージはディスパッチされず、キー イベントは発生しません。
false を返す場合は、IsInputKeyが呼び出されます. |
前処理が必要な特殊なキー、または KeyDown イベントを発生させ、コントロールにディスパッチする必要がある通常の文字キーを確認します。 | IsInputKey | メソッドが true を返す場合は、コントロールが通常の文字であり、 KeyDown イベントが発生します。
false 場合は、ProcessDialogKeyが呼び出されます。
手記:コントロールでキーまたはキーの組み合わせを確実に取得するには、PreviewKeyDown イベントを処理し、IsInputKeyのPreviewKeyDownEventArgsを目的のキーまたはキーにtrue するように設定します。 |
ナビゲーション キー (ESC、TAB、Return、または方向キー) を確認します。 | ProcessDialogKey | このメソッドは、コントロールとその親の間でフォーカスを切り替えるなど、コントロール内の特別な機能を使用する物理キーを処理します。 イミディエイト コントロールがキーを処理しない場合は、親コントロールで ProcessDialogKey が呼び出され、階層内の最上位のコントロールに呼び出されます。 このメソッドが true を返す場合、前処理は完了し、キー イベントは生成されません。
false を返すと、KeyDown イベントが発生します。 |
KeyPress イベントの前処理
アクション | 関連メソッド | 注記 |
---|---|---|
キーがコントロールによって処理される必要がある通常の文字であることを確認します | IsInputChar | 文字が通常の文字の場合、このメソッドは true を返し、 KeyPress イベントが発生し、それ以上の前処理は行われません。 それ以外の場合は、 ProcessDialogChar が呼び出されます。 |
文字がニーモニックかどうかを確認します (ボタンの [OK] など) | ProcessDialogChar | このメソッドは、 ProcessDialogKeyと同様に、コントロール階層で呼び出されます。 コントロールがコンテナー コントロールの場合は、それ自体とその子コントロールで ProcessMnemonic を呼び出してニーモニックをチェックします。
ProcessDialogCharがtrue を返した場合、KeyPressイベントは発生しません。 |
キーボード メッセージの処理
キーボード メッセージは、フォームまたはコントロールの WndProc メソッドに到達すると、オーバーライドできる一連のメソッドによって処理されます。 これらの各メソッドは、キーボード メッセージがコントロールによって処理および使用されたかどうかを指定する Boolean 値を返します。 いずれかのメソッドが true
を返した場合、メッセージは処理されたと見なされ、それ以降の処理のためにコントロールの基本または親には渡されません。 それ以外の場合、メッセージはメッセージ キューに残り、コントロールのベースまたは親の別のメソッドで処理される可能性があります。 次の表に、キーボード メッセージを処理するメソッドを示します。
メソッド | 注記 |
---|---|
ProcessKeyMessage | このメソッドは、コントロールの WndProc メソッドによって受信されたすべてのキーボード メッセージを処理します。 |
ProcessKeyPreview | このメソッドは、キーボード メッセージをコントロールの親に送信します。
ProcessKeyPreviewがtrue を返した場合、キー イベントは生成されません。それ以外の場合は、ProcessKeyEventArgsが呼び出されます。 |
ProcessKeyEventArgs | このメソッドは、必要に応じて、 KeyDown、 KeyPress、および KeyUp イベントを発生させます。 |
キーボード メソッドをオーバーライドする方法
キーボード メッセージの前処理と処理時にオーバーライドできるメソッドは多数あります。ただし、一部の方法は他の方法よりも優れた選択肢です。 次の表に、実行する必要があるタスクと、キーボード メソッドをオーバーライドする最適な方法を示します。 メソッドのオーバーライドの詳細については、継承 (C# プログラミング ガイド) または継承 (Visual Basic) を参照してください。
課題 | メソッド |
---|---|
ナビゲーション キーをインターセプトし、 KeyDown イベントを発生させます。 たとえば、テキスト ボックスで Tab と Enter を処理するとします。 |
IsInputKeyをオーバーライドします。 または、PreviewKeyDown イベントを処理し、IsInputKeyのPreviewKeyDownEventArgsを目的のキーまたはキーにtrue するように設定することもできます。 |
コントロールに対して特別な入力またはナビゲーション処理を実行します。 たとえば、リスト コントロールで方向キーを使用して、選択した項目を変更する場合などです。 | オーバーライド ProcessDialogKey |
ナビゲーション キーをインターセプトし、 KeyPress イベントを発生させます。 たとえば、スピンボックス コントロールでは、複数の方向キーを押して項目の進行を高速化する必要があります。 | IsInputCharをオーバーライドします。 |
KeyPress イベント中に特別な入力またはナビゲーション処理を実行します。 たとえば、リスト コントロールで R キーを押しながら文字 r で始まる項目間をスキップします。 | オーバーライド ProcessDialogChar |
カスタムニーモニック処理を実行します。たとえば、ツールバーに含まれる所有者が描画したボタンのニーモニックを処理する場合などです。 | ProcessMnemonicをオーバーライドします。 |
こちらも参照ください
.NET Desktop feedback