Подтвердить что ты не робот

Как работает копировальная вставка форматированного текста?

Я смущен тем, что реализует функциональность копирования и вставки. Именно это меня смущает:

При копировании форматированного текста из MS Word (который использует другой язык разметки, чем HTML) и вставки в RTF-редактор в веб-браузере, таком как gmail или http://www.freerichtexteditor.com/index.php?inc=demo/index форматирование сохраняется, но теперь разметка преобразуется в HTML. Как это произошло? Что позаботилось об обращении?

И если бы я вставлял этот текст в другое приложение, он будет преобразован в этот формат. Если бы я скопировал некоторую страницу html и вставил ее в слово, тогда будет преобразование разметки из HTML в слово. Опять же, как?

Затем, если я вставляю этот скопированный форматированный текст в текстовый редактор, например "Блокнот", тогда все форматирование теряется, а разметка удаляется. Какое приложение разделило разметку и преобразовало ее в обычный текст?

Когда я копирую форматированный текст, что именно копируется в буфер обмена? Я программист .NET С#. Как мне запрограммировать это?

4b9b3361

Ответ 1

Данные в буфере обмена расширены записями FORMATETC:

http://msdn.microsoft.com/en-us/library/ms682177%28VS.85%29.aspx

Запись FORMATETC содержит в качестве первого поля элемент cfFormat, который описывает формат файла. cfFormat может быть предопределенным значением, например CF_UNICODETEXT или CF_BITMAP, или определенным типом приложения, определенным, например. Microsoft Word.

В .NET вы, по-видимому, можете запросить объект Clipboard, чтобы узнать, какие форматы данных он содержит:

http://msdn.microsoft.com/en-us/library/system.windows.forms.clipboard.aspx

Метод, который вы ищете, это Clipboard.SetData:

Если вы не знаете формат целевого приложения, вы можете хранить данные в нескольких форматах с помощью этого метода.

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

Чтобы извлечь данные из буфера обмена в определенном формате, сначала используйте метод ContainsData, чтобы определить, содержит ли буфер обмена данные в этом формате, прежде чем извлекать его с помощью метода GetData​​p >

Что касается вашего конкретного вопроса о том, как он работает в Word, приведенные выше ссылки должны дать вам достаточно информации, чтобы написать небольшое средство просмотра буфера обмена самостоятельно. Поскольку Microsoft Word может выводить HTML файлы, я предполагаю, что Word записывает данные в буфер обмена как простые текстовые, HTML, RTF и в формате Word.

Ответ 2

Две вещи случаются, чтобы сделать эту работу. Сначала исходные приложения копируют данные в буфер обмена в нескольких форматах, если это возможно. Например, он может предоставлять HTML, RTF, DOC и текстовые форматы. Во-вторых, приложение назначения записывается для возможности вставки из нескольких форматов, если это возможно. Например, он может сначала искать RTF, и если он недоступен, он может вставлять простой текст, и если он не доступен, он не может вставляться вообще.

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

Ответ 3

Есть некоторые буфера обмена (clipbrd.exe в win xp, например), которые вы можете использовать для просмотра данных, хранящихся в буфере обмена, это поведение объясняется тем, что исходное приложение или получатель (который точно вы найдете в средстве просмотра буфера обмена) поддерживает этот тип данных и преобразуется соответствующим образом.