Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 文本框:禁用';粘贴&x27;选项,同时允许';切割';和';复印件';右击_C#_Winforms - Fatal编程技术网

C# 文本框:禁用';粘贴&x27;选项,同时允许';切割';和';复印件';右击

C# 文本框:禁用';粘贴&x27;选项,同时允许';切割';和';复印件';右击,c#,winforms,C#,Winforms,我在C#WinForms中有一个文本框组件 当我右键单击它时,我想禁用粘贴选项,同时仍然允许用户剪切和复制 我已经调查了几个选项,它们都不完全符合我的要求- 如果我使用此选项,它将阻止剪切和复制以及粘贴我不想要的内容 txt.ShortcutsEnabled=false 如果我覆盖文本框的上下文菜单,我必须自己在新的上下文菜单中编写剪切和复制功能 txt.ContextMenu=新建ContextMenu();//或其他一些 是否有任何选项可用于仅禁用默认上下文菜单的粘贴选项,保留剪切和复制?以

我在C#WinForms中有一个文本框组件

当我右键单击它时,我想禁用粘贴选项,同时仍然允许用户剪切和复制

我已经调查了几个选项,它们都不完全符合我的要求-

  • 如果我使用此选项,它将阻止剪切和复制以及粘贴我不想要的内容

    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);
          }
      } 
      
    注意:返回true,它优先于基类功能。

     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解决方案中所需的“剪切”和“复制”功能。我已经知道此选项(请参阅问题的第二点)。我想停止默认菜单本身,我已接受它作为答案。。