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

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

TextBoxコントロールにクリップボードから文字列のペースト(貼り付け)をできないようにする方法を考えます。

ショートカットキーとコンテキストメニューを無効にする方法

TextBoxコントロールへのペーストは、キーボードによるショートカットキー「Ctrl + V」や「Shift + Insert」の入力、またはコンテキストメニューで「貼り付け」を選択することによって可能です。よって、これらを無効にします。

TextBoxのショートカットキーを無効にする方法は、「Windows Forms FAQ - 27.2 How do I disable pasting into a TextBox (via Ctrl + V and the context menu)?」(リンク切れ)で紹介されています。また、TextBoxにコンテキストメニューが表示されないようにする方法は、「TextBoxで右クリックしてもコンテキストメニューが表示されないようにする」で紹介しています。

この2つの方法を合わせて作成したTextBoxコントロールの例を以下に示します。これを通常のTextBoxの代わりに使用してください。

注意:新しく作成したクラスを、基のコントロールクラスの代わりに使用するという意味が分からないという方は、「「○○○クラスの代わりに派生クラスを使用します」の意味は?」をご覧ください。
VB.NET
コードを隠すコードを選択
Imports System.Windows.Forms
Imports System.Security.Permissions

''' <summary>
''' マウスやキーボードによるペーストを無効にしたTextBox
''' </summary>
Public Class MyTextBox
    Inherits TextBox
    Public Sub New()
        MyBase.New()
        'コンテキストメニューを非表示にする
        Me.ContextMenu = New ContextMenu()
    End Sub

    <SecurityPermission(SecurityAction.Demand, _
        Flags:=SecurityPermissionFlag.UnmanagedCode)> _
    Protected Overrides Function ProcessCmdKey( _
        ByRef msg As Message, keyData As Keys) As Boolean

        'Ctrl+VとShift+Insertを無効にする
        If ((keyData And Keys.Control) = Keys.Control AndAlso _
            (keyData And Keys.KeyCode) = Keys.V) OrElse _
            ((keyData And Keys.Shift) = Keys.Shift AndAlso _
            (keyData And Keys.KeyCode) = Keys.Insert) 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とShift+Insertを無効にする
        if (((keyData & Keys.Control) == Keys.Control &&
            (keyData & Keys.KeyCode) == Keys.V) ||
            ((keyData & Keys.Shift) == Keys.Shift &&
            (keyData & Keys.KeyCode) == Keys.Insert))
        {
            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を使うようにした。
  • 2014/9/27 「ショートカットキーとコンテキストメニューを無効にする方法」で「Shift + Insert」も無効にするようにした。