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

C# 在Winforms的RichTextBox中禁用图像粘贴,c#,winforms,richtextbox,C#,Winforms,Richtextbox,我们有一个用户控件,它从RichTextBox中读取。我们希望禁止用户在此用户控件中输入任何图像(使用复制粘贴) 我发现有几个地方提到这一点: 目前我有以下解决方案: protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (keyData == (Keys)Shortcut.CtrlV || keyData == (Keys)Shortcut.ShiftIns) {

我们有一个用户控件,它从
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键时,我没有收到此消息

您可以尝试覆盖
WndProc
方法来过滤
WM\u 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
消息。另请参见:。

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


这对我很有效。

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

现在,如果你感兴趣的话,我将在这里解释这在我的应用程序中是如何有用的。因此我构建了一个命令系统,我选择RichTextBox而不是普通TextBox的唯一原因是因为我想从命令中为每种类型的东西赋予不同的颜色。命令并不长,所以我没有任何优化问题,而且我不在乎丢失格式,因为我总是自动更改颜色

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

链接1:

链接2:


链接3:

关于您给出的链接:第一个解决方案不适用于上下文菜单。基于长度的内容感觉很脏。我的意思是,我们在这些文本上绑定了一些模型,因此如果模型更改其值并在RichTextBox上反映这一点,它将被检测为粘贴。这应该捕获Ctrl+V和Con文本菜单->粘贴?还是只粘贴第二个?这两种方法都适用。我尝试成功了。奇怪的是,我复制粘贴了他们的代码(请参见我的编辑)但是当我使用ctrl+V时,它不起作用。对不起,你完全正确。这只适用于TextBox。我再试了一次,它也不起作用。有没有办法选择TextBox而不是RichTextBox?这不是一个正确的答案,但这里有一些关于如何使用非托管MFC丰富的编辑控件的建议:和。也许你可以尝试使用不知怎么的?
    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) { }
    }