我们有一个来自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时,我没有收到此消息
答案 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的唯一原因是因为我想为命令中的每种事物赋予不同的颜色。这些命令并不是很长,所以我没有任何优化问题,而且我也不担心丢失格式,因为我总是自动更改颜色。
编辑:顺便说一下,这里有一些指向其他站点上相同问题的链接,这些链接可能实际上对您有帮助:
链接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/