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

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
コードを隠すコードを選択
Imports System.Windows.Forms
Imports System.Security.Permissions

''' <summary>
''' マウスやキーボードによるペーストを無効にしたTextBox
''' </summary>
Public Class MyTextBox
    Inherits TextBox

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

    <SecurityPermission(SecurityAction.Demand, _
        Flags:=SecurityPermissionFlag.UnmanagedCode)> _
    Protected Overrides Function ProcessCmdKey( _
        ByRef msg As Message, ByVal keyData As Keys) As Boolean
        'Ctrl+Vを無効にする
        If (keyData And Keys.Control) = Keys.Control AndAlso _
            (keyData And Keys.KeyCode) = Keys.V Then
            Return True
        Else
            Return MyBase.ProcessCmdKey(msg, keyData)
        End If
    End Function
End Class
C#
コードを隠すコードを選択
using System.Windows.Forms;
using System.Security.Permissions;

/// <summary>
/// マウスやキーボードによるペーストを無効にしたTextBox
/// </summary>
public class MyTextBox : TextBox
{
    public MyTextBox() : base()
    {
        //コンテキストメニューを非表示にする
        this.ContextMenu = new ContextMenu();
    }

    [SecurityPermission(SecurityAction.Demand,
        Flags = SecurityPermissionFlag.UnmanagedCode)]
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        //Ctrl+Vを無効にする
        if ((keyData & Keys.Control) == Keys.Control &&
            (keyData & Keys.KeyCode) == Keys.V)
            return true;
        else
            return base.ProcessCmdKey(ref msg, keyData);
    }
}

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

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

VB.NET
コードを隠すコードを選択
Imports System.Windows.Forms
Imports System.Security.Permissions

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

    <SecurityPermission(SecurityAction.Demand, _
        Flags:=SecurityPermissionFlag.UnmanagedCode)> _
    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;
using System.Security.Permissions;

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

    [SecurityPermission(SecurityAction.Demand,
        Flags = SecurityPermissionFlag.UnmanagedCode)]
    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プロパティを使用する方法」を追加。
  • 2009/9/27 ProcessCmdKeyをオーバーライドする方法のコードの間違いを修正。
  • 2009/10/13 ProcessCmdKeyをオーバーライドする方法を修正。
  • 2010/6/30 WndProcにSecurityPermissionAttributeを付けた。
  • 2013/12/9 SecurityAction.LinkDemandの代わりにSecurityAction.Demandを使うようにした。