テキストボックスの右クリックで表示されるコンテキストメニューを表示しない動作にする - C#

テキストボックスで右クリックすると表示されるコンテキストメニューが表示されない動作に変更する方法を紹介します。

ShortcutsEnabled プロパティを設定する方法

テキストボックスの"ShortcutsEnabled"プロパティをFalseに変更するとコンテキストメニューを表示しない動作に変更できます。

UI

下図のUIを作成します。フォームにテキストボックスを2つ配置します。


片方のテキストボックスの"ShortcutsEnabled"プロパティの値を"False"に変更します。

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


"ShortcutsEnabled"プロパティを"False"に変更したテキストボックスでは、右クリックでコンテキストメニューが表示されなくなります。

空のContextMenuStripを割り当てる方法

別の方法として、何もメニュー要素を追加していない空のContextMenuStripをフォームに配置し、TextBoxのContextMenuプロパティに配置した空のContextMenuStripを割り当てることでも同様の動作を実現できます。



WM_CONTEXTMENU を無視する

MW_CONTEXTMENU ウィンドウメッセージを無視する方法でもコンテキストメニューの表示を抑制できます。
この方法を用いる場合は、テキストボックスのコンポーネントを作成する必要があります。

コード

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace NotPasteTextBox
{
  public partial class InvalidPasteTextBox : TextBox
  {
    const int WM_CONTEXTMENU = 0x007B;

    public InvalidPasteTextBox()
    {
      InitializeComponent();
    }

    public InvalidPasteTextBox(IContainer container)
    {
      container.Add(this);
      InitializeComponent();
    }
    
    protected override void WndProc(ref Message message)
    {
      switch (message.Msg) {
        case WM_CONTEXTMENU:
          message.Result = IntPtr.Zero;
          return;
      }
      base.WndProc(ref message);
    }
  }
}

解説

protected override void WndProc(ref Message message)
{
  switch (message.Msg) {
    case WM_CONTEXTMENU:
      message.Result = IntPtr.Zero;
      return;
  }
  base.WndProc(ref message);
}
WndProcメソッドをオーバーライドし、ウィンドウメッセージを取得します。WM_CONTEXTMENU メッセージを受信した場合は、ウィンドウメッセージを処理しない動作にします。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2012-06-19
iPentec all rights reserverd.