Обнаружить любое изображение в буфере обмена - PullRequest
1 голос
/ 03 июня 2011

Прямо сейчас я хочу запретить пользователю вставлять в текстовое поле любой контент с изображением любого типа. Clipboard.ContainsImage не будет работать, поскольку он обнаруживает только некоторые типы и не будет обнаружен, если в буфере обмена содержится текст с изображением.

Мне нужен способ обнаружить изображение внутри текста, одно изображение, несколько изображений ... внутри буфера обмена, чтобы иметь возможность очистить буфер обмена, если это произойдет. Мне нужно избегать этого тяжелого контента, чтобы добраться до базы данных ...

Спасибо

Ответы [ 3 ]

2 голосов
/ 03 июня 2011

Проблема больше, чем просто предотвращение изображения, поскольку RTF может встраивать любой объект, включая текстовые документы или произвольные двоичные данные.

Единственные 3 варианта, которые я могу придумать

  1. Ограничить максимальный размер данных, который вы разрешаете сохранять в базе данных, при этом изображения под этим размером не проблема, так как их размер допустим.

  2. Используйте библиотеку, которая позволит вам анализировать и понимать содержимое RTF, чтобы вы могли проверить его на наличие чего-либо, кроме стандартного текста и форматирования. Затем вы можете удалить любые встроенные двоичные объекты. В качестве альтернативы, вы можете обработать WM_PASTE и проверить буфер обмена на RTF-текст. Если у него есть текст RTF, вы можете анализировать его и удалять внедренные объекты при вставке, а не при сохранении. Если у него нет RTF-версии, не забудьте проверить, есть ли у него текстовая версия.

  3. Перехватывать и обрабатывать сообщение WM_PASTE и использовать RichTextBox.Paste (DateFormats) , чтобы контролировать, какие типы данных могут быть вставлены. Затем вы можете ограничить это только вставкой в ​​буфер обмена простой версии данных, которая не может содержать встроенные объекты. Недостатком здесь является то, что пользователь не может вставить форматированный текст из другого приложения, все форматирование будет потеряно.

1 является самым простым, но допускает, что пользователи смогут вставлять небольшие изображения и другие мелкие объекты, такие как текстовые документы или видео, при условии, что он меньше максимального размера.

2 более сложный, но предлагает лучший пользовательский опыт.

3 проще, чем 2, но предлагает плохой пользовательский интерфейс, так как если бы вы не заботились о форматированном тексте, вы бы не использовали расширенное текстовое поле. Если только вы не хотите использовать простой текст и используете его для большей емкости текста, но если бы это было так, вы бы просто выбрали версию для простого текста для сохранения в БД, которая не содержала бы изображений.

0 голосов
/ 21 июня 2013

Это простое консольное приложение покажет вам, какие типы данных у вас есть в буфере обмена:

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 голосов
/ 03 июня 2011

Что показывает следующее?

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

Я ожидаю, что он включит что-то вроде DeviceIndependentBitmap в качестве одного из доступных форматов, так что, возможно, вы сможете найти это и снять отключить вставку в таких случаях.

В качестве альтернативы, что вы получите, если загляните в буфер обмена и просто посмотрите текст?например,

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

Я знаю, что для обычных изображений это будет нулевым, и если это верно для вашего случая смешанного режима, возможно, вы можете очистить буфер обмена в этом случае.

...