デフォルトの状態ではテキストボックスで右クリックすると嫌でもコンテキストメニュー(ショートカットメニュー、ポップアップメニュー)が表示されます。これを表示させないようにする方法を紹介します。
.NET Framework 2.0以降では、TextBoxコントロールのShortcutsEnabledプロパティをfalseにすることで、コンテキストメニューが表示されなくなるようです。しかしこの場合は、Ctrl + Cや、Ctrl + Vなど、すべてのショートカットキーが使えなくなります。
TextBoxコントロールのContextMenuプロパティに空のContextMenuオブジェクトを設定すると、コンテキストメニューが表示されなくなります。
.NET Framework 2.0以降では、ContextMenuStripプロパティに空のContextMenuStripオブジェクトを設定することでも可能です。
補足:ただしContextMenuStripプロパティよりもContextMenuプロパティが優先されますので、ContextMenuプロパティに空でないContextMenuオブジェクトが設定されている場合はコンテキストメニューが表示されます。(逆に、ContextMenuStripプロパティに空でないContextMenuStripオブジェクトが設定されていたとしても、ContextMenuプロパティに空のContextMenuオブジェクトが設定されていればコンテキストメニューは表示されなくなります。)
次の例ではテキストボックスTextBox1の右クリックでコンテキストメニューが表示されないようにしています。
'TextBox1のContextMenuに空のContextMenuを指定し、 'TextBox1の右クリックでコンテキストメニューが '表示されないようにする TextBox1.ContextMenu = New ContextMenu
//TextBox1のContextMenuに空のContextMenuを指定し、 //TextBox1の右クリックでコンテキストメニューが //表示されないようにする TextBox1.ContextMenu = new ContextMenu();
この方法では、テキストボックスでマウスの右ボタンを押し、テキストボックスの外でボタンを離すと、コンテキストメニューが表示されてしまうようです。これを防ぐ方法は、「TextBoxのContextMenuプロパティが無視される問題の解決法」で説明しています。
TextBoxのWndProcをオーバーライドして、WM_CONTEXTMENU messageが送られてきたら何もしないようにするという方法でも、コンテキストメニューを表示しないようにできます。
以下にその例を示します。このNoContextMenuTextBoxコントロールをTextBoxコントロールの代わりに使用してください。代わりに使用するという意味が分からない場合は、「「○○○クラスの代わりに派生クラスを使用します」の意味は?」をご覧ください。
''' <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
/// <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); } }
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。