【问题标题】:Disable image paste in RichTextBox in Winforms在 Winforms 的 RichTextBox 中禁用图像粘贴
【发布时间】:2015-06-06 02:02:32
【问题描述】:

我们有一个继承自RichTextBox 的用户控件。我们想禁止用户在这个用户控件中输入任何图像(带有复制粘贴)。

我发现有几个地方说到这个:

目前我有这个解决方案:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == (Keys)Shortcut.CtrlV || keyData == (Keys)Shortcut.ShiftIns)
    {
        if (Clipboard.ContainsImage())
        {
            return false;
        }
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

这适用于使用 CTRL+C-CTRL+V 进行复制粘贴,但不适用于上下文菜单。

编辑

我尝试了给定的命题:

public class CustomRichBox : RichTextBox
{
    private const int WM_PASTE = 0x0302;
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_PASTE )
        {
            if (Clipboard.ContainsImage())
            {
                return;
            }
        }
        base.WndProc(ref m);
    }
}

但是当我按 CTRL+V 时,我没有收到此消息

【问题讨论】:

标签: c# winforms richtextbox


【解决方案1】:

遗憾的是,没有全局粘贴事件,您可以像在 WPF 中那样订阅它。但也许这对你来说是一个解决方案:

hook on default "Paste" event of WinForms TextBox control

这对我有用。

【讨论】:

  • 这应该捕获 Ctrl+V 和上下文菜单 -> 粘贴?还是只有第二个?
  • 这应该适用于两者。我尝试成功了。
  • 这很奇怪,我复制粘贴了他们的代码(见我的编辑)但是当我按 ctrl+V 时,它不起作用。
  • 对不起,你说得对。这仅适用于文本框。我又试了一次,还是不行。有没有办法选择TextBox而不是RichTextBox?
【解决方案2】:

您可以尝试覆盖WndProc 方法来过滤WM_PASTE 消息:

protected override void WndProc(ref Message m)
{
    // Trap WM_PASTE with image:
    if (m.Msg == 0x302 && Clipboard.ContainsImage())
    {
        return;
    }
    base.WndProc(ref m);
}

编辑
不幸的是,这种方法不起作用,因为RichTextBox 控件不会向自身发送WM_PAINT 消息。另见:Detecting if paste event occurred inside a rich text box

【讨论】:

  • 好吧,关于您提供的链接:第一个解决方案不适用于上下文菜单。基于长度的东西感觉很脏。我的意思是我们在这些文本上绑定了一些模型,因此如果模型更改其值并将其反映在 RichTextBox 上,它将被检测为粘贴
【解决方案3】:

作为一种快速解决方法,我尝试仅在另一个 RichTextBox 中复制文本(使用 RichTextBox.Text),然后在第一个 RichTextBox 中复制 Rtf 字符串,所有这些都在“TextChanged”事件中。但是,这种解决方法有很多缺点。第一个:未优化,第二个也是最重要的:您丢失了所有文本格式,这可能是您首先选择 RichTextBox 的原因,第三个:您仍然可以在 RTB 中看到一两帧的图像,直到它消失,并且如果用户正在编写一个大文本,它就不能很顺利地工作(但幸运的是,如果你在粘贴事件中复制粘贴代码,你可以解决这个问题)。但是,事实证明它在我的应用程序中非常有用,这就是我在此处发布此答案的原因。 所以这里是所有代码(假设你有一个名为 RTB 的 RichTextBox 和一个名为 auxRTB 的辅助 RichTextBox):

    private void RTB_TextChanged(object sender, EventArgs e)
    {
        int selStart = RTB.SelectionStart;
        int selLenght = RTB.SelectionLength;
        auxRTB.Text = RTB.Text;
        RTB.TextChanged -= RTB_TextChanged;
        RTB.Rtf = string.Copy(auxRTB.Rtf);
        RTB.TextChanged += RTB_TextChanged;
        try
        {
            RTB.SelectionStart = selStart;
            RTB.SelectionLength = selLenght;
        }
        catch (Exception) { }
    }

现在,如果您有兴趣,我将在此解释它在我的应用程序中有何用处。所以我建立了一个命令系统,我选择 RichTextBox 代替普通 TextBox 的唯一原因是因为我想从命令中为每种类型的事物赋予不同的颜色。这些命令并不意味着很长,所以我没有任何优化问题,而且我不关心丢失格式,因为我总是自动更改颜色。

编辑:顺便说一下,这里有一些指向其他网站上相同问题的链接,实际上可能会对您有所帮助:

链接1:https://social.msdn.microsoft.com/Forums/en-US/0f762cb8-7383-4937-8ee8-f8df5d3a9852/disable-image-paste-in-richtextbox?forum=wpf

链接2:C# / WPF: Richtextbox: Find all Images

链接 3:https://thomaslevesque.com/2015/09/05/wpf-prevent-the-user-from-pasting-an-image-in-a-richtextbox/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    相关资源
    最近更新 更多