2009-12-11 6 views
23

Я смущен тем, что реализует функциональность копирования и вставки. Это именно то, с чем меня смущает:Как работает копировальная вставка форматированного текста?

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

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

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

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

ответ

7

Данные в буфере обмена увеличивается с 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

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

3

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

+0

ничего подобного для Windows 7? – claws

+0

clip.exe заменяет clipbrd.exe в Windows 7 –

+0

clip.exe - это утилита командной строки. Его цель - не просматривать, а отправлять что-то в буфер обмена из командной строки. как dir | зажим; clip claws

6

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

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

Смежные вопросы