Ctrl+C 和 Ctrl+V 如何工作?

Ctrl+C 和 Ctrl+V 如何工作?

Ctrl我总是想知道当我将图像(选择它并使用+ )复制到 Word 文件(使用+C粘贴)中时,在操作系统中到底发生了什么。CtrlV

答案1

所有系统都有一个共同点,那就是键盘快捷键,CtrlC例如非系统级– 它们由每个程序单独处理,就像“复制”或“粘贴”菜单项是每个程序所特有的一样。因此,并不是操作系统本身“复制”了某些内容,而是应用程序 (Word) 使用某些操作系统特有的功能将数据放入全局剪贴板。

视窗

在 Windows 中,剪贴板 API 和存储缓冲区由操作系统在内核级别提供。(剪贴板属于“窗口站”内核对象。)

  • 当你“复制”某些内容时,程序将使用 Win32 API 函数存储“复制”的数据SetClipboardData(),这也对应于NtUserSetClipboardData()Native API 中。

    通常情况下,复制的数据会立即存储在操作系统管理的剪贴板缓冲区中,不再依赖于源程序。程序可以提供几种不同的格式– 例如,从 Word 复制的文本除了 Word 自身的格式外,还可以同时采用 HTML、RTF 和纯文本格式。

    然而,该计划可能存储“空”数据并延迟转换,直到使用 请求粘贴WM_RENDERFORMAT,例如,如果复制的数据很大。在这种情况下,程序关闭时数据会丢失。您可能见过 Word 或 Photoshop 在退出程序时询问此问题。

    (请注意,当您通过 Explorer “剪切”或“复制”整个文件时,这不会将整个文件的内容放入剪贴板,而只会放入粘贴时 Explorer 本身会理解的文件引用。)

  • 当你要求程序“粘贴”时,程序会选择所需的格式并使用GetClipboardData(). 某些程序(例如写字板或画图)具有“粘贴为”功能,可让您选择首选格式(例如,如果您从 Web 浏览器复制但想要粘贴而不格式化)。

另请参阅博客文章“NT 调试:剪贴板的工作原理”

Linux、BSD、Solaris、OpenVMS

在 Linux 和其他类似系统中,剪贴板由您使用的图形环境(即 X11 服务器或 Wayland 合成器)提供 - 在这些环境之外运行的程​​序没有共享剪贴板。

X11

X11 处理剪贴板略有不同 - X 服务器根本不提供存储,它仅促进复制源程序(宣布它有“复制”的内容)和粘贴目标程序之间的通信。

初始的“复制”通知和随后的“粘贴”传输都是根据 ICCCM 协议通过 X11 消息完成的。(因此,每个 X 显示器都有一个单独的剪贴板

  • 按下后CtrlC,源程序将跟踪“复制”的数据它自己的内存并将声明对名为“CLIPBOARD”的 X11“选择”的所有权,这是使用 完成的XSetSelectionOwner()

    此所有权由 X 服务器(例如 Xorg)集中跟踪。每当您“复制”新内容时,拥有“剪贴板”选项的先前应用程序都会收到失去所有权的通知,以便它可以丢弃现在不需要的数据。

    由于剪贴板传输总是被延迟,因此一旦关闭“源”程序,复制的数据通常会丢失(除非您正在运行“剪贴板管理器”,它会主动存储所有复制的内容)。因此,如果您从 Firefox 复制某些内容,然后关闭 Firefox,则无法再粘贴它。

  • 粘贴时,程序将使用 查找“剪贴板”选择的当前所有者XGetSelectionOwner()。与 Windows 类似,X11 剪贴板可以保存几种备选类型的数据,因此目标程序将使用 向源询问首选类型XConvertSelection()

    (通常有一种名为“TARGETS”的特殊类型可用,它让源程序返回当前可用的数据类型的 ASCII 列表。)

此链接举一个实际的例子。

注意:当您通过选择文本“复制”文本并使用鼠标中键单击粘贴时,机制是相同的,但使用的是“PRIMARY”选择。这就是术语“X11 选择”的由来。

韦兰

我实际上不明白它在 Wayland 中是如何工作的,我所拥有的只是协议文档:

非图形程序

传统文本编辑器(Vim、emacs、nano)通常有自己的内部剪贴板(又名寄存器/killring)。

基于终端的应用程序可能如果在图形终端仿真器中运行,则可以访问 X11 或 Wayland 剪贴板,例如 Vim 的"+寄存器将从 X11 剪贴板粘贴(而其他 Vim 寄存器位于程序内部)。

苹果系统 (Mac OS X)

在 macOS 中,似乎使用了一种称为“粘贴板服务器”的东西(我认为这意味着程序通过 Mach API 与其通信)。除此之外,它的行为类似于 Windows 剪贴板,并存储当前复制的数据本身。

我对图像更感兴趣,它们怎么能这么容易被复制

图像没有什么特别之处——它们仍然只是可以表示为字节的二进制数据块,因此如果它们可以保存在文件中(例如 PNG 或 JPEG 格式),那么它们也可以使用相同的格式存储在剪贴板中。

Windows 应用程序通常以 BMP/DIB 格式存储复制的图像(与 .bmp 文件相同),而在 Linux 上,应用程序通常提供 PNG(即“image/png”目标)。

相关内容