Форматы буфера обмена

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

В следующих разделах описаны форматы буфера обмена.

Стандартные форматы буфера обмена

Форматы буфера обмена, определенные системой, называются стандартными форматами буфера обмена. Эти форматы буфера обмена описаны в стандартных форматах буфера обмена.

Зарегистрированные форматы буфера обмена

Многие приложения работают с данными, которые нельзя преобразовать в стандартный формат буфера обмена без потери информации. Эти приложения могут создавать собственные форматы буфера обмена. Формат буфера обмена, определенный приложением, называется зарегистрированным форматом буфера обмена. Например, если приложение для обработки слов копировало форматированный текст в буфер обмена с использованием стандартного текстового формата, данные форматирования будут потеряны. Решение должно было бы зарегистрировать новый формат буфера обмена, например формат rtF.

Чтобы зарегистрировать новый формат буфера обмена, используйте функцию RegisterClipboardFormat . Эта функция принимает имя формата и возвращает целочисленное значение без знака, представляющее зарегистрированный формат буфера обмена. Чтобы получить имя зарегистрированного формата буфера обмена, передайте целочисленное значение без знака в функцию GetClipboardFormatName.

Если несколько приложений регистрируют формат буфера обмена с точно таким же именем, формат буфера обмена регистрируется только один раз. Оба вызова функции RegisterClipboardFormat возвращают одно и то же значение. Таким образом, два разных приложения могут совместно использовать данные с помощью зарегистрированного формата буфера обмена.

Форматы закрытого буфера обмена

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

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

Дополнительные сведения о сообщении WM_DESTROYCпакет интерфейса пользователя BOARD см. в разделе "Владение буфером обмена".

Приложение может поместить дескриптор данных в буфер обмена, определив частный формат в диапазоне CF_GDIOBJFIRST через CF_GDIOBJLAST. При использовании значений в этом диапазоне дескриптор данных не является дескриптором объекта интерфейса графических устройств Windows (GDI), но является дескриптором, выделенным функцией GlobalAlloc с флагом GMEM_MOVEABLE. При очистке буфера обмена система автоматически удаляет объект с помощью функции GlobalFree .

Несколько форматов буфера обмена

Окно может поместить несколько объектов буфера обмена в буфер обмена, каждый из которых представляет одну информацию в другом формате буфера обмена. При размещении сведений в буфер обмена окно должно предоставлять данные в максимально возможном количестве форматов. Чтобы узнать, сколько форматов в настоящее время используются в буфере обмена, вызовите функцию CountClipboardFormats .

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

Например, предположим, что пользователь копирует стильный текст из документа word-обработки. Окно, содержащее документ, может сначала поместить данные в буфер обмена в зарегистрированном формате, например RTF. Затем окно помещнет данные в буфер обмена в менее описательном формате, например текст (CF_TEXT).

Когда содержимое буфера обмена вставлено в другое окно, окно извлекает данные в наиболее описательном формате, который он распознает. Если окно распознает RTF, соответствующие данные вставляется в документ. В противном случае текстовые данные вставляется в документ и сведения о форматировании теряются.

Синтезированные форматы буфера обмена

Система неявно преобразует данные между определенными форматами буфера обмена: если окно запрашивает данные в формате, который не находится в буфере обмена, система преобразует доступный формат в запрошенный формат. Система может преобразовать данные, как указано в следующей таблице.

Формат буфера обмена Формат преобразования
CF_BITMAP CF_DIB
CF_BITMAP CF_DIBV5
CF_DIB CF_BITMAP
CF_DIB CF_PALETTE
CF_DIB CF_DIBV5
CF_DIBV5 CF_BITMAP
CF_DIBV5 CF_DIB
CF_DIBV5 CF_PALETTE
CF_ENHMETAFILE CF_METAFILEPICT
CF_METAFILEPICT CF_ENHMETAFILE
CF_OEMTEXT CF_TEXT
CF_OEMTEXT CF_UNICODETEXT
CF_TEXT CF_OEMTEXT
CF_TEXT CF_UNICODETEXT
CF_UNICODETEXT CF_OEMTEXT
CF_UNICODETEXT CF_TEXT

 

Если система предоставляет автоматическое преобразование типов для определенного формата буфера обмена, то нет преимуществ для размещения форматов преобразования в буфер обмена.

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

При копировании растровых изображений рекомендуется поместить формат CF_DIB или CF_DIBV5 в буфер обмена. Это связано с тем, что цвета в зависимом от устройства растровом рисунке (CF_BITMAP) относятся к системной палитре, которая может измениться до вставки растрового изображения. Если формат CF_DIB или CF_DIBV5 находится в буфере обмена, а окно запрашивает формат CF_BITMAP, система отображает независимое от устройства растровое изображение (DIB) с помощью текущей палитры в то время.

Если вы помещаете формат CF_BITMAP в буфер обмена (а не CF_DIB), система отрисовываетформат CF_DIB или CF_DIBV5 буфера обмена сразу после закрытия буфера обмена. Это гарантирует, что правильная палитра используется для создания DIB. Если CF_DIBV5 формат с информацией о цветовом пространстве растрового изображения в буфере обмена, система преобразует битовые изображения из точечных цветового пространства в цветовое пространство SRGB при запросе CF_DIB или CF_DIBV5. Если CF_DIBV5 запрашивается, если в буфере обмена нет сведений о цветовом пространстве, система возвращает сведения о цветовом пространстве SRGB в структуре BITMAPV5HEADER. Преобразования между другими форматами буфера обмена происходят по требованию.

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

Существует два формата буфера обмена для метафайлов: CF_ENHMETAFILE и CF_METAFILEPICT. Укажите CF_ENHMETAFILE для расширенных метафайлов и CF_METAFILEPICT для метафайлов Windows.

Форматы журнала буфера обмена и буфера обмена в облаке

Некоторые версии Windows включают Cloud Clipboard, который хранит журнал последних элементов данных буфера обмена и может синхронизировать его между устройствами пользователя. Если вы не хотите, чтобы данные приложения были включены в журнал буфера обмена или синхронизированы с другими устройствами, приложение может управлять этим поведением, размещая данные в определенных зарегистрированных форматах буфера обмена, имена которых известны системе Windows:

  • ExcludeClipboardContentFromMonitorProcessing : поместите все данные в буфер обмена в этом формате, чтобы предотвратить включение всех форматов буфера обмена в журнал буфера обмена или синхронизацию с другими устройствами пользователя.
  • CanIncludeInClipboardHistory : поместите сериализованное значение DWORD в буфер обмена в этом формате, чтобы предотвратить включение всех форматов буфера обмена в журнал буфера обмена или поместите значение одного вместо явного запроса, чтобы элемент буфера обмена был включен в журнал буфера обмена. Это не влияет на синхронизацию с другими устройствами пользователя.
  • CanUploadToCloudClipboard : поместите сериализованное значение DWORD нуля в буфер обмена в этом формате, чтобы предотвратить синхронизацию всех форматов буфера обмена с другими устройствами пользователя или поместите значение одного вместо явного запроса на то, что элемент буфера обмена синхронизируется с другими устройствами. Это не влияет на журнал буфера обмена локального устройства.

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