在Winforms中禁用RichTextBox中的图像粘贴

时间:2015-04-01 12:14:14

标签: c# winforms richtextbox

我们有一个来自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时,我没有收到此消息

3 个答案:

答案 0 :(得分:0)

您可以尝试覆盖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

答案 1 :(得分:0)

可悲的是,没有全局粘贴事件,您可以在WPF中订阅。但也许这是一个解决方案:

hook on default "Paste" event of WinForms TextBox control

这对我有用。

答案 2 :(得分:0)

作为一种快速的解决方法,我尝试仅在另一个RichTextBox中复制Text(使用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/