2011-06-03 42 views
1

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

我需要的是一种方法来检测文本中的图像,单独的图像,多个图像...在剪贴板中,以便能够清除剪贴板,如果发生这种情况。我需要避免这个沉重的含量要达到数据库...

感谢

+0

重复的问题? http://stackoverflow.com/questions/4774840/determine-if-file-copied-into-clipboard-is-an-image/4774911#4774911 – 2011-06-03 14:01:25

+0

不是重复。该问题涉及剪贴板上的图像格式文件。该问题涉及剪贴板中的混合内容,其中混合内容包含图像数据。 – 2011-06-03 14:05:35

+0

*“我需要避免这种沉重的内容”* - 不要使用RichTextBox? – 2011-06-03 14:16:35

回答

2

的问题是不是简单地防止图像更大,因为RTF可以嵌入包括Word文档或者任意的二进制数据的任何对象。

只有3个选择,我能想到

  1. 限制你允许保存到数据库中的最大数据大小的,在这说下大小点的图像arn't一个问题,因为它与允许的大小。

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

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

1是最简单的,但承认,用户将能够嵌入小图片和其他小物件如Word文档或视频,只要它是最大尺寸下。

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

3比2简单,但提供了糟糕的用户体验,就好像您不关心格式化文本一样,您不会使用富文本框。除非您只想要纯文本并且正在使用其较大的文本容量,但如果是这种情况,您只需要获取纯文本版本以保存到不包含图像的数据库。

+0

我已经尝试了#3,但它当然没有被接受。我也想过#1,但它也没有被接受。我相信#2提供了更广泛的可能性。实际上,如果我们需要它,我们正在考虑购买另一种替代品,所以如果我们不需要,我会提供更新。谢谢您的帮助。 – Fjodr 2011-06-03 16:18:35

0

以下显示的是什么?

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

我希望它包括像DeviceIndependentBitmap作为可用的格式之一,因此,或许你可以查找并清除禁用粘贴这样的情况。

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

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

我知道对于普通的图像,这将是零,如果这是你的混合模式情况属实,或许可以清除在这种情况下剪贴板。

+0

尽管DIB需要一些工作来粘贴图像。 – Nyerguds 2017-10-02 13:59:14

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

实际上,您可以将任何自定义格式的东西放在剪贴板上:DataFormats常量是_plain和简单strings_。目前常用的透明图像是“PNG”,我经常以自定义数据格式将剪贴板上的东西放在剪贴板上,这些数据格式专门用于我的应用程序(可能还有其他实例)。 – Nyerguds 2017-10-02 13:57:42