C# 文本框:禁用';粘贴&x27;选项,同时允许';切割';和';复印件';右击
我在C#WinForms中有一个文本框组件 当我右键单击它时,我想禁用粘贴选项,同时仍然允许用户剪切和复制 我已经调查了几个选项,它们都不完全符合我的要求-C# 文本框:禁用';粘贴&x27;选项,同时允许';切割';和';复印件';右击,c#,winforms,C#,Winforms,我在C#WinForms中有一个文本框组件 当我右键单击它时,我想禁用粘贴选项,同时仍然允许用户剪切和复制 我已经调查了几个选项,它们都不完全符合我的要求- 如果我使用此选项,它将阻止剪切和复制以及粘贴我不想要的内容 txt.ShortcutsEnabled=false 如果我覆盖文本框的上下文菜单,我必须自己在新的上下文菜单中编写剪切和复制功能 txt.ContextMenu=新建ContextMenu();//或其他一些 是否有任何选项可用于仅禁用默认上下文菜单的粘贴选项,保留剪切和复制?以
txt.ShortcutsEnabled=false代码>
文本框
的上下文菜单
,我必须自己在新的上下文菜单中编写剪切和复制功能
txt.ContextMenu=新建ContextMenu();//或其他一些
是否有任何选项可用于仅禁用默认上下文菜单的粘贴选项,保留剪切和复制?以下两个步骤禁用文本框中的复制/粘贴功能:
- 禁用默认菜单并将文本框与空 没有菜单项的上下文菜单(鼠标操作)
- 用户仍然可以使用键盘上的快捷键执行以下操作:
这些行动。
因此,重写ProcessCmdKey方法,如下所示:
// Constants private const Keys CopyKeys = Keys.Control | Keys.C; private const Keys PasteKeys = Keys.Control | Keys.V; protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if((keyData == CopyKeys) || (keyData == PasteKeys)) { return true; } else { return base.ProcessCmdKey(ref msg, keyData); } }
this.contextMenuStrip1.Items.AddRange(new
System.Windows.Forms.ToolStripItem[] {
this.Undo,
this.Cut,
this.Copy,
this.Paste,
this.Delete,
this.SelectAll});
this.contextMenuStrip1.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip1_Opening);
this.txt.ContextMenuStrip = this.contextMenuStrip1;
或者您可以使用:
ContextMenuStrip mnu = new ContextMenuStrip();
ToolStripMenuItem mnuCopy = new ToolStripMenuItem("Copy");
ToolStripMenuItem mnuCut = new ToolStripMenuItem("Cut");
mnuCopy.Click += new EventHandler(mnuCopy_Click);
mnuCut.Click += new EventHandler(mnuCut_Click);
mnu.MenuItems.AddRange(new MenuItem[] { mnuCopy, mnuCut});
txt.ContextMenu = mnu;
注意:您不能在默认上下文菜单中禁用过去选项,因为您必须在表单中添加contextMenuStrip。
this.contextMenuStrip1.Items.AddRange(new
System.Windows.Forms.ToolStripItem[] {
this.Undo,
this.Cut,
this.Copy,
this.Paste,
this.Delete,
this.SelectAll});
this.contextMenuStrip1.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip1_Opening);
this.txt.ContextMenuStrip = this.contextMenuStrip1;
希望对您有用假定粘贴菜单项始终是textbox上下文菜单中的第五个元素(以零为基,分隔符也算作项),您可以将
textbox
类(此处:CustomMenuTextBox
)子类化,并覆盖WndProc
方法以禁用该特定菜单项:
public static class User32
{
[DllImport("user32.dll")]
public static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable);
}
public class CustomMenuTextBox : TextBox
{
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0093 /*WM_UAHINITMENU*/ || m.Msg == 0x0117 /*WM_INITMENUPOPUP*/ || m.Msg == 0x0116 /*WM_INITMENU*/)
{
IntPtr menuHandle = m.Msg == 0x0093 ? Marshal.ReadIntPtr(m.LParam) : m.WParam;
// MF_BYPOSITION and MF_GRAYED
User32.EnableMenuItem(menuHandle, 4, 0x00000400 | 0x00000001);
}
base.WndProc(ref m);
}
}
基于 如果您只需要剪切、复制和粘贴选项,那么最好创建自定义contentMenuStrip,您可以在Visual Studio中直观地执行此操作,而且实现复制、剪切和粘贴选项非常容易。然后,您可以在程序中控制何时启用或不启用任何选项 例如,此代码在自定义ContentMenuStrip的打开事件中,当未在文本框中选择文本时禁用复制和剪切,并且仅当剪贴板包含文本或图像时才启用粘贴
private void contextSuperEditor_Opening(object sender, CancelEventArgs e)
{
if (tbText.SelectionLength > 0)
{
MenuCopy.Enabled = true;
MenuCut.Enabled = true;
MenuPaste.Enabled = false;
}
else
{
MenuCopy.Enabled = false;
MenuCut.Enabled = false;
if (Clipboard.ContainsText() | Clipboard.ContainsImage())
{
MenuPaste.Enabled = true;
}
}
}
是否有帮助?您只想在右键单击时禁用粘贴菜单项?或禁用使用键盘快捷键粘贴too@Anand只有右键单击..@Thomas这些选项没有帮助。我只想在右键单击中禁用粘贴选项(不需要自己实现剪切/复制和其他默认上下文菜单功能)。键盘是受管理的。如果您想通过
Ctrl-V
保留粘贴,为什么拒绝在问题中阐明这一点的编辑?您不想通过Ctrl-V
保留粘贴功能吗?这不会保留Abdul解决方案中所需的“剪切”和“复制”功能。我已经知道此选项(请参阅问题的第二点)。我想停止默认菜单本身,我已接受它作为答案。。