「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号」で紹介したものを基にしています。)
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。