关于剪贴板

剪贴板是一组函数和消息,促使应用程序能够传输数据。 由于所有应用程序都可以访问剪贴板,因此可以在应用程序之间或在应用程序中轻松传输数据。

剪贴板由用户驱动。 窗口应仅在响应用户的命令时往返剪贴板传输数据。 窗口不得在用户不知情的情况下使用剪贴板传输数据。

剪贴板上的内存对象可以采用任何数据格式(称为剪贴板格式)。 每个格式都由无符号整数值标识。 对于标准(预定义)剪贴板格式,此值是在 Winuser.h 中定义的常量;对于已注册剪贴板格式,这是 RegisterClipboardFormat 函数的返回值。

除了注册剪贴板格式之外,单个窗口还执行大多数剪贴板操作。 通常,窗口过程会将信息传输到剪贴板或从剪贴板传输信息,以响应 WM_COMMAND 消息。

本部分讨论了以下内容:

剪贴板命令

用户通常会从应用程序的“编辑 ”菜单中选择命令来执行剪贴板操作。 下面是标准剪贴板命令的简要描述。

命令 说明
剪切 将当前所选内容的副本放在剪贴板上,并从文档中删除所选内容。 剪贴板之前的内容将被销毁。
复制 将当前所选内容的副本放在剪贴板上。 文档保持不变。 剪贴板之前的内容将被销毁。
粘贴 将当前所选内容替换为剪贴板的内容。 剪贴板的内容不会更改。
删除 从文档中删除当前所选内容。 剪贴板的内容不会更改。 此命令不涉及剪贴板,但它应与“编辑”菜单上的剪贴板命令一起显示。

 

剪贴板序列号

每个窗口站的剪贴板都有关联的剪贴板序列号。 每当剪贴板的内容发生更改时,此数字就会递增。 若要获取剪贴板序列号,请调用 GetClipboardSequenceNumber 函数。

剪贴板查看器

剪贴板查看器是显示剪贴板当前内容的窗口。 剪贴板查看器窗口会方便用户,并且不会影响剪贴板的数据事务函数。

通常,剪贴板查看器窗口至少可以显示三种最常见的格式:CF_TEXTCF_BITMAPCF_METAFILEPICT。 如果窗口不能以这三种格式中的任何一种格式提供数据,则应以显示格式提供数据或使用所有者显示格式。

剪贴板查看器链是两个或多个实体的链接,以便它们相互依赖执行操作。 这种相互依赖(链)允许所有正在运行的剪贴板查看器应用程序接收发送到当前剪贴板的消息。

以下是本节中要讨论的主题。

剪贴板查看器窗口

窗口可调用 SetClipboardViewer 函数来将自身添加到剪贴板查看器链。 返回值是链中下一个窗口的句柄。 若要检索链中第一个窗口的句柄,请调用 GetClipboardViewer 函数。

每个剪贴板查看器窗口都必须跟踪剪贴板查看器链中的下一个窗口。 剪贴板内容发生更改时,系统会将 WM_DRAWCLIPBOARD 消息发送给链中的第一个窗口。 更新其显示后,每个剪贴板查看器窗口都必须将此消息传递给链中的下一个窗口。

在关闭之前,剪贴板查看器窗口必须调用 ChangeClipboardChain 函数来从剪贴板查看器链中删除自身。 接着,系统将 WM_CHANGECBCHAIN 消息发送给链中的第一个窗口。

有关处理 WM_DRAWCLIPBOARDWM_CHANGECBCHAIN 消息的详细信息,请参阅创建剪贴板查看器窗口

显示格式

显示格式是用于在剪贴板查看器窗口中显示信息的剪贴板格式。 若剪贴板所有者使用专用或已注册剪贴板格式,但不使用任何最常见的标准格式,则必须以显示格式提供数据,以便在剪贴板查看器窗口中查看。 显示格式仅用于查看,而不得粘贴到文档中。

四种显示格式包括:CF_DSPBITMAPCF_DSPMETAFILEPICTCF_DSPTEXTCF_DSPENHMETAFILE。 这些显示格式的呈现方式与标准格式相同,即:CF_BITMAPCF_TEXTCF_METAFILEPICTCF_ENHMETAFILE

所有者显示格式

对于不使用任何常用标准剪贴板格式的剪贴板所有者,提供显示格式的替代方案是使用所有者显示 (CF_OWNERDISPLAY) 剪贴板格式。

通过使用所有者显示格式,剪贴板所有者可以直接控制剪贴板查看器窗口的绘制,以避免以其他格式呈现数据的开销。 每当必须重新绘制某个窗口部分或者滚动窗口或调整其大小时,剪贴板查看器窗口都会向剪贴板所有者发送消息。

标准剪贴板格式