在Windows中,剪贴板实际上是什么?

5
这可能听起来像一个愚蠢的问题,但实际上剪贴板是什么?
当我注意到剪贴板被用于比我最初认为的更复杂的方式时,我的好奇心被激发了。我认为剪贴板基本上会跟踪文本字符串、图像或文件,然后只要上下文匹配,它就会将其粘贴到用户指定的位置。
然而,在像Microsoft Word这样的文字处理软件中,我注意到你可以直接从网站复制和粘贴样式,并且在像Skype这样的程序中,你可以复制看起来像普通文本的引用,但实际上是格式化的Skype UI中的注释。
我查看了一个虚假的Skype引用生成器的源代码,似乎有多个剪贴板。或者说剪贴板是按键值类型映射布局的吗?
2个回答

3

当你使用SetClipboardData时,有多个剪贴板数据格式可供选择。你可以同时设置多个剪贴板格式,因为剪贴板需要使用EmptyClipboard显式地进行清除。你还可以注册自己的自定义格式,以在应用程序之间使用。

另一方打开剪贴板,查看当前有哪些格式,选择最合适的格式,然后相应地进行操作。


1
我认为需要指出的是,剪贴板不仅是一个静态的地方,可以存储数据(甚至是多种格式),而且还可以告诉Windows:“剪贴板中有东西,如果有人想看,请让我知道”。然后基本上没有任何东西存储在剪贴板中,只有这个“注释” - 只有当您粘贴它时,剪贴板所有者才会以所需的格式生成所需的数据。这也是为什么例如Word会在您退出时询问您是否要保留它(因为那样它就必须被实现)。 - CherryDT
1
这实际上是一个非常有用的优化:假设您在Word中复制或剪切了大量数据。Word不需要创建该数据的物理副本并将其放入剪贴板中。因此,当您再次在Word中粘贴它时,Word知道这是一个“内部操作”,可以以更优化的方式移动您的信息(例如,它可以通过引用旧图像来创建图像的副本,而不是复制所有像素)。只有在将其粘贴到不知道任何此类信息的应用程序中时,才会创建所需格式的实际副本。 - CherryDT
@CherryDT:是的,谢谢你加上这个。只是因为原帖似乎特别提到了多种格式的问题,尽管标题很笼统,所以我保持简单... :) - Yakov Galka

2
为了补充@ybungalobill的答案,可以在Windows Dev Center 这里阅读其他信息。 CUT/COPY操作的一个快速摘录是 -
要将信息放在剪贴板上,窗口首先使用EmptyClipboard函数清除任何先前的剪贴板内容。此函数向先前的剪贴板所有者发送WM_DESTROYCLIPBOARD消息,释放与剪贴板上的数据相关联的资源,并将剪贴板所有权分配给打开剪贴板的窗口。要找出哪个窗口拥有剪贴板,请调用GetClipboardOwner函数。
清空剪贴板后,窗口以尽可能多的剪贴板格式将数据放在剪贴板中,按从最具描述性的剪贴板格式到最不具描述性的顺序排列。对于每种格式,窗口调用SetClipboardData函数,指定格式标识符和全局内存句柄。内存句柄可以为NULL,表示窗口根据请求呈现数据。有关详细信息,请参见延迟呈现。
如果您愿意,可以在API参考中跟进函数定义。但SetClipboardData是发生魔法的地方。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接