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

TextBoxで右クリックしてもコンテキストメニューが表示されないようにする

デフォルトの状態ではテキストボックスで右クリックすると嫌でもコンテキストメニュー(ショートカットメニュー、ポップアップメニュー)が表示されます。これを表示させないようにする方法を紹介します。

.NET Framework 2.0以降で、ShortcutsEnabledをfalseにする方法

.NET Framework 2.0以降では、TextBoxコントロールのShortcutsEnabledプロパティをfalseにすることで、コンテキストメニューが表示されなくなるようです。しかしこの場合は、Ctrl + Cや、Ctrl + Vなど、すべてのショートカットキーが使えなくなります。

ContextMenuに空のContextMenuオブジェクトを指定する方法

TextBoxコントロールのContextMenuプロパティに空のContextMenuオブジェクトを設定すると、コンテキストメニューが表示されなくなります。

.NET Framework 2.0以降では、ContextMenuStripプロパティに空のContextMenuStripオブジェクトを設定することでも可能です。

補足:ただしContextMenuStripプロパティよりもContextMenuプロパティが優先されますので、ContextMenuプロパティに空でないContextMenuオブジェクトが設定されている場合はコンテキストメニューが表示されます。(逆に、ContextMenuStripプロパティに空でないContextMenuStripオブジェクトが設定されていたとしても、ContextMenuプロパティに空のContextMenuオブジェクトが設定されていればコンテキストメニューは表示されなくなります。)

次の例ではテキストボックスTextBox1の右クリックでコンテキストメニューが表示されないようにしています。

VB.NET
コードを隠すコードを選択
'TextBox1のContextMenuに空のContextMenuを指定し、
'TextBox1の右クリックでコンテキストメニューが
'表示されないようにする
TextBox1.ContextMenu = New ContextMenu
C#
コードを隠すコードを選択
//TextBox1のContextMenuに空のContextMenuを指定し、
//TextBox1の右クリックでコンテキストメニューが
//表示されないようにする
TextBox1.ContextMenu = new ContextMenu();

この方法では、テキストボックスでマウスの右ボタンを押し、テキストボックスの外でボタンを離すと、コンテキストメニューが表示されてしまうようです。これを防ぐ方法は、「TextBoxのContextMenuプロパティが無視される問題の解決法」で説明しています。

WM_CONTEXTMENUを無視する方法

TextBoxのWndProcをオーバーライドして、WM_CONTEXTMENU messageが送られてきたら何もしないようにするという方法でも、コンテキストメニューを表示しないようにできます。

以下にその例を示します。このNoContextMenuTextBoxコントロールをTextBoxコントロールの代わりに使用してください。代わりに使用するという意味が分からない場合は、「「○○○クラスの代わりに派生クラスを使用します」の意味は?」をご覧ください。

VB.NET
コードを隠すコードを選択
''' <summary>
''' コンテキストメニューを表示しないTextBoxコントロール
''' </summary>
Public Class NoContextMenuTextBox
    Inherits TextBox
    Private Const WM_CONTEXTMENU As Integer = &H7B

    Protected Overrides Sub WndProc(ByRef m As Message)
        'WM_CONTEXTMENUメッセージの時は何もしないようにする
        If m.Msg = WM_CONTEXTMENU Then
            Return
        End If
        MyBase.WndProc(m)
    End Sub
End Class
C#
コードを隠すコードを選択
/// <summary>
/// コンテキストメニューを表示しないTextBoxコントロール
/// </summary>
public class NoContextMenuTextBox : TextBox
{
    private const int WM_CONTEXTMENU = 0x7B;

    protected override void WndProc(ref Message m)
    {
        //WM_CONTEXTMENUメッセージの時は何もしないようにする
        if (m.Msg == WM_CONTEXTMENU)
        {
            return;
        }
        base.WndProc(ref m);
    }
}
  • 履歴:
  • 2007/1/15 .NET Framework 2.0に関する記述を追加。
  • 2014/10/4 WM_CONTEXTMENUを無視する方法を追加。

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

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