剪贴板格式

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

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

标准剪贴板格式

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

已注册的剪贴板格式

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

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

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

专用剪贴板格式

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

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

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

应用程序可以通过在范围 CF_GDIOBJFIRST 通过 CF_GDIOBJLAST定义专用格式,在剪贴板上放置数据句柄。 在此范围内使用值时,数据句柄不是 Windows 图形设备接口 (GDI) 对象的句柄,而是由具有 GMEM_MOVEABLE 标志的 GlobalAlloc 函数分配的句柄。 当剪贴板清空时,系统会使用 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

 

如果系统为特定剪贴板格式提供自动类型转换,则无法将转换格式(s)放在剪贴板上。

如果系统为特定剪贴板格式提供自动类型转换,并且调用 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 值置于剪贴板上,以防止剪贴板历史记录中包含所有剪贴板格式,或放置一个值,以显式请求剪贴板项包含在剪贴板历史记录中。 这不会影响同步到用户的其他设备。
  • CanUploadToCloudClipboard:将此格式的序列化 DWORD 值置于剪贴板上,以防止所有剪贴板格式同步到用户的其他设备,或放置一个值,以显式请求将剪贴板项同步到其他设备。 这不会影响本地设备的剪贴板历史记录。

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