DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

Buttonコントロールにフォーカスがあるとフォームで矢印キーのキーイベントが発生しない

KeyPressなどのキーイベントをすべてフォームが受け取るようにする」で紹介したようにフォームのKeyPreviewプロパティをtrueにしてKeyDownやKeyUpなどのキーイベントをフォームで受け取るようにしていても、例えばButtonコントロールにフォーカスがあると矢印キーやタブキーの押下でキーイベントが発生しません。

矢印キーが押されたかをフォームで知る場合は、「コントロールで矢印、Tab、Enter、Escキーが押されたことを知る」と同様に、フォームクラスのProcessDialogKeyメソッドをオーバーライドします。

具体的には、次のようなコードをフォームクラスに追加します。この例では、左キーとタブキーが押された時に、メッセージボックスを表示するようにしています。

VB.NET
コードを隠すコードを選択
<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
C#
コードを隠すコードを選択
[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キーが押された時にメッセージボックスを表示し、次のコントロールがアクティブにならないようにすることができます。

VB.NET
コードを隠すコードを選択
<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
C#
コードを隠すコードを選択
[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;
}
  • 履歴:
  • 2010/6/30 ProcessDialogKeyとProcessTabKeyにUIPermissionAttributeを付けた。
  • 2013/12/9 SecurityAction.LinkDemandの代わりにSecurityAction.Demandを使うようにした。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。