检测剪贴板上的任何图像

本文关键字:任何 图像 剪贴板 检测 | 更新日期: 2023-09-27 17:58:16

现在我想防止用户将任何带有任何类型图像的内容粘贴到富文本框中。Clipboard.ContainsImage无法工作,因为它只检测某些类型,如果剪贴板中包含带有图像的文本,则不会检测到它。

我需要的是一种方法来检测文本中的图像,单独的图像,多个图像。。。在剪贴板内部,以便在发生这种情况时能够清除剪贴板。我需要避免这些繁重的内容才能访问数据库。。。

感谢

检测剪贴板上的任何图像

问题不仅仅是阻止图像,因为RTF可以嵌入任何对象,包括word文档或任意二进制数据。

我能想到的仅有的3个选项

  1. 限制允许保存到数据库的最大数据大小,此时该大小以下的图像不会有问题,因为它在允许的大小内。

  2. 使用库可以让您解析和理解RTF内容,这样您就可以检查标准文本和格式之外的任何内容。然后,您可以剥离任何嵌入的二进制对象。或者,您可以处理WM_PASTE并检查剪贴板中的RTF文本。如果它有RTF文本,您可以在粘贴而不是保存时解析它并剥离嵌入的对象。如果它没有RTF版本,不要忘记检查它是否有纯文本版本。

  3. 截获并处理WM_PASTE消息,并使用RichTextBox.Poste(DateFormats)控制可以粘贴哪些数据类型。然后,您可以将此限制为仅将数据的纯文本版本粘贴到剪贴板上,而剪贴板不能包含嵌入对象。这里的缺点是用户无法粘贴来自不同应用程序的格式化文本,所有格式都将丢失。

1是最简单的,但用户可以嵌入小图像和其他小对象,如word文档或视频,只要它在最大大小以下。

2更为复杂,但提供了最佳的用户体验。

3比2简单,但提供了较差的用户体验,就好像你不在乎格式化的文本,你就不会使用富文本框。除非你只想要纯文本,并且使用它的文本容量更大,但如果是这样的话,你只需要获取纯文本版本来保存到数据库中,而数据库中不包含图像。

下面显示了什么?

 IDataObject clipData = Clipboard.GetDataObject();
 var formats = clipData.GetFormats();

我希望它能包含类似DeviceIndependentBitmap的内容作为可用格式之一,所以也许你可以查找并清除禁用粘贴这种情况。

或者,如果你偷看剪贴板,只寻找文本,你会得到什么?例如

 IDataObject clipData = Clipboard.GetDataObject();
... clipData.GetData(System.Windows.Forms.DataFormats.Text); 

我知道对于普通图像,这将是空的,如果混合模式的情况是真的,那么在这种情况下,也许你可以清除剪贴板。

这个简单的控制台应用程序将向您显示剪贴板中的数据类型:

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();
        }
    }
}