ShowDialogやShowを拡張メソッドで実装した場合、被表示FormでKeyDownイベントが発生しない

ちょっとだけ詰んだのでメモ程度に。

 

public void ShowDialog(IWin32Window owner, String test){

    base.ShowDialog(owner);

}

 

こういう感じに拡張メソッドを実装しているとします。

 

ShowまたはShowDialogを実行する前にKeyPreview = trueを入れます。

 

public void ShowDialog(IWin32Window owner, String test){

    this.KeyPreview = true;

    base.ShowDialog(owner);

}

 

キーイベントがフォーカスを持つコントロールに渡される前に、フォームがそのキーイベントを受け取るかどうか、という説明の通り、

親フォームからKeyDownイベントを取得するかどうかというのを、KeyPreviewで設定しています。

 

デフォルトではfalseなので、コンストラクタまたは該当する拡張メソッドで実装しなければKeyEventが発生しないようになっています。

また、この方法を使用しても一部のコントロールではKeyEventが受け取られないため、別の方法で対策しなければなりません。