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

DOBON.NET

TextBoxにペースト(貼り付け)できないようにする

TextBoxにクリップボードから文字列の貼り付けをできないようにする方法を考えます。

「Ctrl + V」とコンテキストメニューを無効にする方法

まず、キーボードの「Ctrl + V」を無効にし、TextBoxにコンテキストメニューが表示されないようにする方法があります。これは、「Disabling clipboard related operations in multiline text box in a windows forms application」(リンク切れ)で紹介されている方法です。

キーボードの「Ctrl + V」を無効にする方法は、「Windows Forms FAQ - 27.2 How do I disable pasting into a TextBox (via Ctrl + V and the context menu)?」にあります。また、TextBoxにコンテキストメニューが表示されないようにする方法は、こちらで紹介しています。これらのやり方を合体させて作成したクラスを以下に示します。これを通常のTextBoxの代わりに使用してください。

注意:新しく作成したクラスを、基のコントロールクラスの代わりに使用するという意味が分からないという方は、こちらをご覧ください。

[VB.NET]
''' <summary>
''' マウスやキーボードによるペーストを無効にしたTextBox
''' </summary>
Public Class MyTextBox
    Inherits TextBox
    Private pasteKeys As Keys = Keys.V Or Keys.Control

    Public Sub New()
        'コンテキストメニューを非表示にする
        Me.ContextMenu = New ContextMenu
    End Sub

    Protected Overrides Function ProcessCmdKey( _
        ByRef msg As Message, ByVal keyData As Keys) As Boolean
        'Ctrl+Vを無効にする
        If (keyData Or pasteKeys) = pasteKeys Then
            Return True
        Else
            Return MyBase.ProcessCmdKey(msg, keyData)
        End If
    End Function
End Class
[C#]
//using System.Windows.Forms;
//がソースファイルの一番上に書かれているものとする

/// <summary>
/// マウスやキーボードによるペーストを無効にしたTextBox
/// </summary>
public class MyTextBox : TextBox
{
    const Keys pasteKeys = Keys.V | Keys.Control;

    public MyTextBox() : base()
    {
        //コンテキストメニューを非表示にする
        this.ContextMenu = new ContextMenu();
    }

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        //Ctrl+Vを無効にする
        if ((keyData | pasteKeys) == pasteKeys)
            return true;
        else
            return base.ProcessCmdKey(ref msg, keyData);
    }
}

WM_PASTEメッセージを無視する方法

また、WM_PASTEメッセージを無視するという方法も考えられます。以下にこの方法によるコードを示します。

[VB.NET]
''' <summary>
''' マウスやキーボードによるペーストを無効にしたTextBox
''' </summary>
Public Class MyTextBox
    Inherits TextBox
    Private WM_PASTE As Integer = &H302

    Protected Overrides Sub WndProc(ByRef m As Message)
        If m.Msg = WM_PASTE Then
            Return
        End If
        MyBase.WndProc(m)
    End Sub
End Class
[C#]
//using System.Windows.Forms;
//がソースファイルの一番上に書かれているものとする

/// <summary>
/// マウスやキーボードによるペーストを無効にしたTextBox
/// </summary>
public class MyTextBox : TextBox
{
    const int WM_PASTE = 0x302;

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_PASTE)
            return;

        base.WndProc(ref m);
    }
}

.NET Framework 2.0以降で、ShortcutsEnabledプロパティを使用する方法

.NET Framework 2.0からは、TextBoxクラスにShortcutsEnabledプロパティが追加されました。このプロパティをfalseにすることにより、TextBoxで使用できるすべてのショートカットキーを無効にできます。また、コンテキストメニューも表示されなくなります。よって、文字列の貼り付けもできなくなります。

しかし、すべてのショートカットが無効となるため、コピーなどの操作もできなくなります。

  • 履歴:
  • 2007/1/16 「.NET Framework 2.0以降で、ShortcutsEnabledプロパティを使用する方法」を追加。

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

  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。