フォームでコントロールのキーイベントを受け取る(フックする) KeyPreview [C#]

.NETのWindowsフォームアプリケーションで、フォームに配置したコントロールのイベントを、フォーム側で取得したい場合があります。
例えば、フォーム上に複数のテキストボックスが配置されており、Enterキーが押された時に、次または前のコントロールにフォーカスを移動したい場合などです。

今回の記事は、C#のプロジェクトを使ってフォームに配置されたコントロールのキーイベントを、フォーム側で受け取って処理する方法を紹介します。

本記事ではVisual Studioで作成した、Windowsフォームアプリケーションのプロジェクトに記述するコードを記載します。
Windowsフォームアプリケーションのプロジェクトを作成する方法については、以下の記事を参照してください。

Windowsフォームアプリケーションのプロジェクト(ソリューション)を作成する。[C#]
Visual StudioでC#のWindowsフォームアプリケーションのプロジェクト(ソリューション)を作成する方法を記載します。 ...

コントロールのキーイベントを受け取る

コントロールのキーイベントを受け取れるようにするには、System.Windows.Forms名前空間にあるFormクラスのKeyPreviewプロパティを使用します。
KeyPreviewプロパティはbool型(ブーリアン型)になっていますので、TrueまたはFalseの真理値(真偽値)で指定します。
フォームのKeyPreviewプロパティは、フォームデザイナーのプロパティグリッド、またはコードで設定することができます。

デザイナーのプロパティグリッドで設定する

フォームデザイナーを開きます。
フォームデザイナーを開いたら、プロパティウィンドウを表示します。
プロパティウィンドウが表示されていない場合は、メニューバーの「表示」メニューにある「プロパティ ウィンドウ」をクリックするかF4キーを押してください。

フォームデザイナーのプロパティグリッド
上記の画像のプロパティグリッドは項目別ではなくアルファベット順で表示しています。

デザイナーのプロパティグリッドにあるKeyPreviewプロパティのドロップダウンリストから、Enterキーが押された時にクリックされるボタンを選択します。(ドロップダウンリストのアイテムには、フォーム上に配置したボタンの一覧が表示されます。)

フォームデザイナーのKeyPreviewプロパティ

コードで設定する

コードエディタを表示して以下のコードを入力します。

キーイベントが発生する順番

フォームのKeyPreviewプロパティをTrueに設定した際のイベントの発生する順番は、フォームのキーイベントが先に発生し、アクティブなコントロールのキーイベントが後に発生します。

フォーム

フォームのキープレビュー KeyPreview キーイベント発生サンプル

実行結果

コンソールには以下の値が出力されます。

サンプルプログラム

ここではサンプルプログラムとして、Enterキーが押された時に、フォームに複数配置されたコントロールのフォーカスを順番に移動するアプリケーションを作成します。

フォームデザイン(ユーザーインターフェース)

フォームのキープレビュー KeyPreview サンプル画面デザイン

ソースコード

フォームのKeyDownイベントでEnterキーが押された時の処理を実装します。

プログラムの実行

サンプルプロジェクトをビルドして実行(デバッグ)します。

フォームのキープレビュー KeyPreview サンプル画面表示

Enterキーを押すと、コントロールのフォーカスが移動します。