现在我想阻止用户将具有任何类型图像的任何内容粘贴到富文本框中。 Clipboard.ContainsImage不起作用,因为它只检测某些类型,如果剪贴板包含带有图像的文本,则不会检测到它。
我需要的是一种方法来检测文本内部的图像,单独的图像,多个图像......在剪贴板内部,如果发生这种情况,可以清除剪贴板。我需要避免这些繁重的内容到达数据库...
由于
答案 0 :(得分:2)
问题不仅仅是简单地阻止图像,因为RTF可以嵌入任何对象,包括word文档或任意二进制数据。
我能想到的唯一3个选项
限制允许保存到数据库的最大数据大小,此时该大小的图像不会出现问题,因为它具有允许的大小。
使用可让您解析和理解RTF内容的库,以便检查标准文本和格式以外的任何内容。然后你可以去掉任何嵌入的二进制对象。或者,您可以处理WM_PASTE并检查剪贴板中的RTF文本。如果它有RTF文本,您可以解析它并在粘贴时剥离嵌入的对象而不是保存时。如果它没有RTF版本,请不要忘记检查它是否有纯文本版本。
拦截并处理WM_PASTE消息并使用RichTextBox.Paste(DateFormats)来控制可以粘贴的数据类型。然后,您可以将此限制为仅粘贴剪贴板上的数据的纯文本版本,该版本不能包含嵌入的对象。这里的缺点是用户无法粘贴来自不同应用程序的格式化文本,所有格式都将丢失。
1是最简单的,但接受用户将能够嵌入小图像和其他小对象,如word文档或视频,只要它在最大尺寸下。
2更复杂但提供最佳用户体验。
3比2更简单,但提供了糟糕的用户体验,就好像您不关心格式化文本一样,您不会使用富文本框。除非您只需要纯文本并且正在使用其较大的文本容量,但如果是这种情况,您只需要获取纯文本版本以保存到不包含图像的数据库。
答案 1 :(得分:0)
以下内容如何显示?
IDataObject clipData = Clipboard.GetDataObject();
var formats = clipData.GetFormats();
我希望它包含像DeviceIndependentBitmap这样的可用格式之一,所以也许您可以查找并清除禁用粘贴这样的情况。
或者,如果您偷看剪贴板并查找文本,您会得到什么?例如
IDataObject clipData = Clipboard.GetDataObject();
... clipData.GetData(System.Windows.Forms.DataFormats.Text);
我知道对于普通的图像,这将是null,如果这对于你的混合模式情况是正确的,也许你可以在这种情况下清除剪贴板。
答案 2 :(得分:0)
这个简单的控制台应用程序将向您显示剪贴板中的数据类型:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms; // reference is added manually.
namespace ctt // Clipboard Types Tester
{
class Program
{
[STAThread] // it is important! Without this Clipboard.GetDataObject() returns null.
static void Main()
{
// 'formatsAll' is from http://www.radsoftware.com.au/articles/clipboardmonitor.aspx
string[] formatsAll = new string[]
{
DataFormats.Bitmap,
DataFormats.CommaSeparatedValue,
DataFormats.Dib,
DataFormats.Dif,
DataFormats.EnhancedMetafile,
DataFormats.FileDrop,
DataFormats.Html,
DataFormats.Locale,
DataFormats.MetafilePict,
DataFormats.OemText,
DataFormats.Palette,
DataFormats.PenData,
DataFormats.Riff,
DataFormats.Rtf,
DataFormats.Serializable,
DataFormats.StringFormat,
DataFormats.SymbolicLink,
DataFormats.Text,
DataFormats.Tiff,
DataFormats.UnicodeText,
DataFormats.WaveAudio
};
IDataObject data = Clipboard.GetDataObject();
if (data == null)
System.Console.WriteLine("Error!");
else
{
bool empty = true;
foreach (string format in formatsAll)
if (data.GetDataPresent(format))
{
empty = false;
break;
}
if (empty) System.Console.WriteLine("Now clipboard is empty.");
else
{
System.Console.WriteLine("Now clipboard contains the following types:");
System.Console.WriteLine();
foreach (string format in formatsAll)
if (data.GetDataPresent(format))
System.Console.WriteLine(format);
}
}
System.Console.ReadKey();
}
}
}