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

単一行テキストボックスでEnterやEscapeキーを押した時にビープ音が鳴らないようにする

テキストボックスが単一行(MultilineプロパティがFalse)の場合、エンターキーやエスケープキーを押すと、Beep音が鳴ります。これを防ぐ方法をいくつか紹介します。

KeyPressイベントを使用する方法

EnterやEscapeキーが押された時に、KeyPressイベントハンドラでKeyPressEventArgs.HandledをTrueにすれば、ビープ音が鳴らなくなります。

VB.NET
コードを隠すコードを選択
'KeyPressイベントハンドラ
Private Sub TextBox1_KeyPress(ByVal sender As Object, _
        ByVal e As KeyPressEventArgs) _
        Handles TextBox1.KeyPress
    'EnterやEscapeキーでビープ音が鳴らないようにする
    If e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Enter) OrElse _
        e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Escape) Then
        e.Handled = True
    End If
End Sub
C#
コードを隠すコードを選択
//KeyPressイベントハンドラ
private void TextBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    //EnterやEscapeキーでビープ音が鳴らないようにする
    if (e.KeyChar == (char)Keys.Enter || e.KeyChar == (char)Keys.Escape)
    {
        e.Handled = true;
    }
}
補足:.NET Framework 2.0からは、KeyDownイベントハンドラでKeyEventArgs.SuppressKeyPressプロパティをTrueにすることによっても、同様のことができます。

ProcessDialogKeyメソッドをオーバーライドする方法

フォームのProcessDialogKeyメソッドをオーバーライドして、EnterやEscapeキーが押された時に、何もせずにTrueを返すという方法もあります。

以下のコードは、テキストボックス(TextBox1)のあるフォームのクラスに記述してください。

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
    'TextBox1でEnterを押してもビープ音が鳴らないようにする
    If TextBox1.Focused AndAlso _
        (keyData And Keys.KeyCode) = Keys.Enter Then
        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)
{
    //TextBox1でEnterを押してもビープ音が鳴らないようにする
    if (TextBox1.Focused &&
        (keyData & Keys.KeyCode) == Keys.Enter)
    {
        return true;
    }
    return base.ProcessDialogKey(keyData);
}

フォームのAcceptButton、CancelButtonプロパティを設定する方法

この方法は、一行もコードを書く必要がありません。

フォームのAcceptButtonプロパティにボタン(Buttonオブジェクト)が設定されている場合は、Enterキーを押してもビープ音が鳴りません。同じように、フォームのCancelButtonプロパティにボタンが設定されている場合は、Escapeキーを押してもビープ音が鳴りません。

つまり、テキストボックスでEnterキーを押してもビープ音が鳴らないようにするには、フォームのAcceptButtonプロパティに適当なボタンを設定すればよいのです。もしAcceptButtonプロパティに設定したいボタンがフォームに無ければ、とりあえずフォームにButtonコントロールを配置してから、そのボタンをフォームのAcceptButtonプロパティに設定し、ボタンのVisibleプロパティをFalseにして、ボタンを隠します。

  • 履歴:
  • 2010/6/30 ProcessDialogKeyにUIPermissionAttributeを付けた。
  • 2013/12/9 SecurityAction.LinkDemandの代わりにSecurityAction.Demandを使うようにした。

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

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。