「KeyPressなどのキーイベントをすべてフォームが受け取るようにする」で紹介したようにフォームのKeyPreviewプロパティをtrueにしてKeyDownやKeyUpなどのキーイベントをフォームで受け取るようにしていても、例えばButtonコントロールにフォーカスがあると矢印キーやタブキーの押下でキーイベントが発生しません。
矢印キーが押されたかをフォームで知る場合は、「コントロールで矢印、Tab、Enter、Escキーが押されたことを知る」と同様に、フォームクラスのProcessDialogKeyメソッドをオーバーライドします。
具体的には、次のようなコードをフォームクラスに追加します。この例では、左キーとタブキーが押された時に、メッセージボックスを表示するようにしています。
<System.Security.Permissions.UIPermission( _ System.Security.Permissions.SecurityAction.Demand, _ Window:=System.Security.Permissions.UIPermissionWindow.AllWindows)> _ Protected Overrides Function ProcessDialogKey( _ ByVal keyData As Keys) As Boolean If (keyData And Keys.KeyCode) = Keys.Left Then '左キーが押されているか調べる MessageBox.Show("左キーが押されました。") '左キーの本来の処理(左側のコントロールにフォーカスを移す)を 'させたくないときは、trueを返す Return True ElseIf (keyData And Keys.KeyCode) = Keys.Tab Then 'Tabキーが押されているか調べる MessageBox.Show("Tabキーが押されました。") Return True End If Return MyBase.ProcessDialogKey(keyData) End Function
[System.Security.Permissions.UIPermission( System.Security.Permissions.SecurityAction.Demand, Window = System.Security.Permissions.UIPermissionWindow.AllWindows)] protected override bool ProcessDialogKey(Keys keyData) { //左キーが押されているか調べる if ((keyData & Keys.KeyCode) == Keys.Left) { MessageBox.Show("左キーが押されました。"); //左キーの本来の処理(左側のコントロールにフォーカスを移す)を //させたくないときは、trueを返す return true; } //Tabキーが押されているか調べる else if ((keyData & Keys.KeyCode) == Keys.Tab) { MessageBox.Show("Tabキーが押されました。"); return true; } return base.ProcessDialogKey(keyData); }
なおタブキーが押されたかを調べる場合は、ButtonのあるフォームのProcessTabKeyメソッドをオーバーライドする方法もあります。フォームクラスに次のようなコードを追加することにより、Tabキーが押された時にメッセージボックスを表示し、次のコントロールがアクティブにならないようにすることができます。
<System.Security.Permissions.UIPermission( _ System.Security.Permissions.SecurityAction.Demand, _ Window:=System.Security.Permissions.UIPermissionWindow.AllWindows)> _ Protected Overrides Function ProcessTabKey( _ ByVal forward As Boolean) As Boolean MessageBox.Show("Tabキーが押されました。") Return True End Function
[System.Security.Permissions.UIPermission( System.Security.Permissions.SecurityAction.Demand, Window = System.Security.Permissions.UIPermissionWindow.AllWindows)] protected override bool ProcessTabKey(bool forward) { MessageBox.Show("Tabキーが押されました。"); return true; }
(この記事は、「.NETプログラミング研究 第53号」で紹介したものを基にしています。)
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。