标准剪贴板格式

标准剪贴板格式

我构建了一个 Windows 窗体工具,用来突出显示一段代码,然后将突出显示的代码复制到clipboardHTMLRTF文本格式中。当我将复制的代码粘贴到WordWordPad或 中时Google Docs,它将以彩色复制。在记事本中,它应该复制为纯文本。这一直有效,直到昨天。突然间,所有文本编辑器都只粘贴纯文本,不再粘贴格式化HTML/RTF内容。但如果我不复制纯文本格式,情况会好一些,Word可以WordPad正常粘贴突出显示的代码。当然,粘贴在记事本中不再起作用。

我的问题是为什么这种行为会突然改变?我有另一台笔记本电脑,也发生了同样的事情。重启机器没有帮助。

答案1

Windows API 支持富/HTML 格式和纯文本剪贴板。

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

以下主题描述了剪贴板格式。

标准剪贴板格式

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

注册剪贴板格式

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

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

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

私人剪贴板格式

应用程序可以通过在 CF_PRIVATEFIRST 到 CF_PRIVATELAST 范围内定义一个值来识别私有剪贴板格式。应用程序可以将私有剪贴板格式用于应用程序定义的数据格式,该格式无需在系统中注册。与私有剪贴板格式相关的数据句柄不会被系统自动释放。如果您的窗口使用私有剪贴板格式,您可以使用 WM_DESTROYCLIPBOARD 消息释放不再需要的任何相关资源。

应用程序可以通过在 CF_GDIOBJFIRST 到 CF_GDIOBJLAST 范围内定义私有格式来将数据句柄放置在剪贴板上。当使用此范围内的值时,数据句柄不是 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_DIB 或 CF_DIBV5 格式的位图放在剪贴板上。这是因为设备相关位图 (CF_BITMAP) 中的颜色与系统调色板有关,在粘贴位图之前可能会发生变化。如果剪贴板上有 CF_DIB 或 CF_DIBV5 格式的位图,并且窗口请求 CF_BITMAP 格式,则系统会使用当时的当前调色板呈现设备无关位图 (DIB)。

来源:https://docs.microsoft.com/en-us/windows/win32/dataxchg/clipboard-formats

因此,这取决于应用程序如何使用 Windows API。丰富的文字处理应用程序支持丰富格式的剪贴板。

作为我使用的工具剪贴板内由 Nirsoft(二进制渲染)和剪辑

答案2

您列出的所有工具都将使用剪贴板中可用的粘贴最佳格式。所以我认为问题出在您的 Windows 窗体工具上。

要调试正在发生的事情,您可以使用该工具 免费剪贴板查看器,它将列出剪贴板中可用的所有格式及其内容。

在此处输入图片描述

相关内容