剪贴板格式

一个窗口可以在剪贴板上放置多个对象,每个对象都以不同的剪贴板格式表示相同的信息。 用户无需了解剪贴板上对象所用的剪贴板格式。

以下几个主题介绍了剪贴板格式。

标准剪贴板格式

系统定义的剪贴板格式称为标准剪贴板格式。 这些剪贴板格式在标准剪贴板格式中介绍。

已注册剪贴板格式

许多应用程序使用无法在不丢失信息的情况下转换为标准剪贴板格式的数据。 这些应用程序可以创建自己的剪贴板格式。 应用程序定义的剪贴板格式称为已注册剪贴板格式。 例如,如果字处理应用程序使用标准文本格式将格式化文本复制到剪贴板,将丢失格式信息。 解决方案是注册新的剪贴板格式,例如 RTF 格式。

若要注册新的剪贴板格式,请使用 RegisterClipboardFormat 函数。 此函数采用格式的名称,并返回表示已注册剪贴板格式的无符号整数值。 若要检索已注册剪贴板格式的名称,请将无符号整数值传递给 GetClipboardFormatName 函数。

如果多个应用程序使用完全相同的名称注册剪贴板格式,则仅注册剪贴板格式一次。 对 RegisterClipboardFormat 函数的两种调用都将返回相同的值。 这样,两个不同的应用程序可以使用已注册剪贴板格式共享数据。

专用剪贴板格式

应用程序可以通过 CF_PRIVATELAST 定义范围 CF_PRIVATEFIRST 中的值,以标识专用剪贴板格式。 应用程序可以将专用剪贴板格式用于不需要向系统注册的应用程序定义的数据格式。

系统不会自动释放与专用剪贴板格式关联的数据句柄。 如果 Windows 使用专用剪贴板格式,则可以使用 WM_DESTROYCLIPBOARD 消息释放任何不再需要的相关资源。

有关 WM_DESTROYCLIPBOARD 消息的详细信息,请参阅剪贴板所有权

应用程序可以将数据句柄放置在剪贴板上,方法是通过 CF_GDIOBJLAST 定义 CF_GDIOBJFIRST 范围中的专用格式。 在使用此范围内的值时,数据句柄不是 Windows 图形设备接口 (GDI) 对象的句柄,而是由 GlobalAlloc 函数使用 GMEM_MOVEABLE 标志分配的句柄。 当清空剪贴板时,系统会自动使用 GlobalFree 函数删除对象。

多个剪贴板格式

一个窗口可以在剪贴板上放置多个剪贴板对象,每个对象都以不同的剪贴板格式表示相同的信息。 将信息放置在剪贴板上时,窗口应以尽可能多的格式提供数据。 若要了解剪贴板上当前使用的格式数,请调用 CountClipboardFormats 函数。

应先将包含最多信息的剪贴板格式放在剪贴板上,然后是描述性较低的格式。 粘贴剪贴板中的信息的窗口通常会检索采用其识别的第一种格式的剪贴板对象。 由于剪贴板格式将按其在剪贴板上的放置顺序进行枚举,因此第一个识别的格式也最具最描述性。

例如,假设用户从字处理文档复制带样式的文本。 包含文档的窗口可能会先以已注册格式(如 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_DIBCF_DIBV5 格式放在剪贴板上。 这是因为设备相关位图 (CF_BITMAP) 中的颜色相对于系统调色板,这些颜色在粘贴位图之前可能会更改。 如果 CF_DIBCF_DIBV5 格式位于剪贴板上,并且窗口请求 CF_BITMAP 格式,则系统届时会使用当前调色板呈现设备无关位图 (DIB)。

如果将 CF_BITMAP 格式放在剪贴板上(而不是 CF_DIB),则系统将在关闭剪贴板后立即呈现 CF_DIBCF_DIBV5 剪贴板格式。 这可确保使用正确的调色板生成 DIB。 如果将含位图颜色空间信息的 CF_DIBV5 格式放在剪贴板中,系统将在请求 CF_DIBCF_DIBV5 时,将位图位从位图颜色空间转换为 sRGB 颜色空间。 如果在剪贴板中没有颜色空间信息时请求了 CF_DIBV5,则系统会在 BITMAPV5HEADER 结构中返回 sRGB 颜色空间信息。 其他剪贴板格式之间的转换将按需进行。

如果剪贴板包含 CF_PALETTE 格式的数据,应用程序应使用 SelectPaletteRealizePalette 函数,针对该逻辑调色板实现剪贴板中的其他任何数据。

元文件有两种剪贴板格式:CF_ENHMETAFILECF_METAFILEPICT。 为增强的元文件指定 CF_ENHMETAFILE,并为 Windows 元文件指定 CF_METAFILEPICT

云剪贴板和剪贴板历史记录格式

某些版本的 Windows 包括云剪贴板,它会保留最近剪贴板数据项的历史记录,并且可以在用户设备之间进行同步。 如果不希望将应用程序放置在剪贴板上的数据包含在剪贴板历史记录中或与其他设备同步,则应用程序可以将数据置于 Windows 系统已知其名称的某些已注册剪贴板格式中,以便控制此行为:

  • ExcludeClipboardContentFromMonitorProcessing:将此格式的任何数据放置在剪贴板上,以防止将所有剪贴板格斯包括在剪贴板历史记录中或同步到用户的其他设备。
  • CanIncludeInClipboardHistory:以此格式将序列化 的 DWORD 值 0 放置在剪贴板上,以防止将所有剪贴板格式包含在剪贴板历史记录中,或放置值 1 以显式请求将剪贴板项包含在剪贴板历史记录中。 这不会影响同步到用户的其他设备。
  • CanUploadToCloudClipboard:以此格式将序列化 DWORD 值 0 放置在剪贴板上,以防止将所有剪贴板格式同步到用户的其他设备,或放置值 1 以显式请求将剪贴板项同步到其他设备。 这不会影响本地设备的剪贴板历史记录。

与其他已注册剪贴板格式一样,需要使用 RegisterClipboardFormat 函数来获取标识上述 3 种格式中的每一种的无符号整数值。