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の代わりに使用してください。
注意:新しく作成したクラスを、基のコントロールクラスの代わりに使用するという意味が分からないという方は、「「○○○クラスの代わりに派生クラスを使用します」の意味は?」をご覧ください。
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
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メッセージを無視するという方法も考えられます。以下にこの方法によるコードを示します。
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
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からは、TextBoxクラスにShortcutsEnabledプロパティが追加されました。このプロパティをfalseにすることにより、TextBoxで使用できるすべてのショートカットキーを無効にできます。また、コンテキストメニューも表示されなくなります。よって、文字列の貼り付けもできなくなります。
しかし、すべてのショートカットが無効となるため、コピーなどの操作もできなくなります。
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。