クリップボードからテキストボックスへの貼り付けを禁止する - C#

クリップボードからテキストボックスへの貼り付けを禁止する方法を紹介します。

ShortcutsEnabled プロパティを利用する方法

ShortcutsEnabled プロパティをFalseにすることで、貼り付けやコピーを禁止できます。詳細はこちらの記事を参照してください。

WM_PASTE ウィンドウメッセージを無視する

WM_PASTEウィンドウメッセージを無視することでペーストを禁止できます。この方法を用いる場合はテキストボックスのコンポーネントを作成する必要があります。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace NotPasteTextBox
{
  public partial class InvalidPasteTextBox : TextBox
  {
    const int WM_PASTE = 0x0302;
    const int WM_CONTEXTMENU = 0x007B;

    public InvalidPasteTextBox()
    {
      InitializeComponent();
    }

    public InvalidPasteTextBox(IContainer container)
    {
      container.Add(this);

      InitializeComponent();
    }
    
    protected override void WndProc(ref Message message)
    {
      switch (message.Msg) {
        case WM_PASTE:
          message.Result = IntPtr.Zero;
          return;
        case WM_CONTEXTMENU:
          message.Result = IntPtr.Zero;
          return;
      }
      base.WndProc(ref message);
    }
  }
}

参考:ProcessCmdKey メソッドでキー入力を無視する

ProcessCmdKeyメソッドをオーバーライドし、"Ctrl+V"キーを無効化して貼り付けを禁止する方法があります。ただし、コンテキストメニューからの貼り付けではペーストできてしまします。この方法を用いる場合はテキストボックスのコンポーネントを作成する必要があります。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace NotPasteTextBox
{
  public partial class InvalidPasteTextBox : TextBox
  {
    const int WM_PASTE = 0x0302;
    const int WM_CONTEXTMENU = 0x007B;

    public InvalidPasteTextBox()
    {
      InitializeComponent();
    }

    public InvalidPasteTextBox(IContainer container)
    {
      container.Add(this);

      InitializeComponent();
    }

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
      Keys cntf = keyData & Keys.Control;
      Keys vf = keyData & Keys.V;

      //if (cntf == Keys.Control && vf == Keys.V) { //でもOK
      if (cntf != 0 && vf != 0) {
        return true;
      }

      return base.ProcessCmdKey(ref msg, keyData);
    }
  }
}
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2018-03-10
作成日: 2012-06-20
iPentec all rights reserverd.