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

TextBoxのContextMenuプロパティが無視される問題の解決法

TextBoxコントロールのContextMenuContextMenuStripプロパティ(以下、ContextMenuStripプロパティ)を使うことで、独自のコンテキストメニューを表示することができます。しかしContextMenuStripプロパティを設定していたとしても、設定していない時に表示されるデフォルトのコンテキストメニューが表示されてしまうことがあります。具体的には、TextBoxコントロール上でマウスの右ボタンを押したままTextBoxの外でボタンを離すと、デフォルトのコンテキストメニューが表示されます。ここではこの問題を回避する方法を紹介します。

この問題の解決法は、「TextBoxで右クリックしてもコンテキストメニューが表示されないようにする」にいただいたコメントや、「.net - How do you stop a textbox showing the default context menu? - Stack Overflow」にあります。これらを参考にさせていただくと、TextBoxコントロールのMouseDownイベントが発生した時に右ボタンが押されているかを調べ、押されていればTextBoxのCaptureプロパティをFalseにしてマウスのキャプチャを解除するという方法が最も簡単のようです。

VB.NET
コードを隠すコードを選択
'TextBox1のMouseDownイベントハンドラ
Private Sub TextBox1_MouseDown(sender As Object, e As MouseEventArgs) _
    Handles TextBox1.MouseDown

    'マウスの右ボタンが押されているか調べる
    If e.Button = MouseButtons.Right Then
        'マウスのキャプチャを解除する
        DirectCast(sender, Control).Capture = False
    End If
End Sub
C#
コードを隠すコードを選択
//TextBox1のMouseDownイベントハンドラ
private void TextBox1_MouseDown(object sender, MouseEventArgs e)
{
    //マウスの右ボタンが押されているか調べる
    if (e.Button == MouseButtons.Right)
    {
        //マウスのキャプチャを解除する
        ((Control)sender).Capture = false;
    }
}

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

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