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

Int*_*Sys 102 memory ctrl paste

我总是想知道引擎盖下发生的(操作系统)时,我的图像(选择它并使用复制Ctrl+ C)到Word文件(粘贴Ctrl+ V),例如。

use*_*686 167

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

  • Ctrl+C告诉程序使用 Win32 API 函数存储“复制”的数据SetClipboardData(),这也对应NtUserSetClipboardData()于 Native API。

    通常,复制的数据会立即存储在操作系统管理的剪贴板缓冲区中,不再依赖于源程序。该程序可以提供多种不同的格式——例如,从 MS Word 复制的文本可以同时采用 HTML、RTF 和纯文本格式。

    (但是,程序可能会存储“空”数据并推迟转换,直到使用 请求粘贴WM_RENDERFORMAT。在这种情况下,程序关闭时数据会丢失。我不确定这种方法有多普遍。)

  • Ctrl+V告诉程序选择所需的格式并使用GetClipboardData(). 某些程序,例如写字板或画图,具有“粘贴为”功能,可让您选择首选格式(例如,如果您复制了 HTML 但不想格式化)。

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

Linux中,没有全系统的剪贴板,而是由提供任何图形您正在使用环境(即,X11,韦兰无):

在 X11(不一定限于 Linux)中,剪贴板传输被推迟。也就是说,存储由“源”程序提供。交换是根据 ICCCM 协议通过 X11 消息完成的(因此剪贴板与 X 服务器隔离):

  • Ctrl+C告诉源程序将“复制”的数据保留在它自己的内存中,并声明名为“CLIPBOARD”的 X11选择。这是使用 完成的XSetSelectionOwner(),所有权由 X 服务器 (Xorg) 跟踪。

    如果您之前复制了某些内容,则会通知之前的选择所有者并丢弃现在不需要的数据。

    如果关闭程序,复制的数据将丢失。(剪贴板管理器可用于通过查看和复制当前选择来避免这种情况。)

  • Ctrl+V告诉目标程序使用 查找“剪贴板”选择的当前所有者XGetSelectionOwner(),然后使用直接询问它的首选类型XConvertSelection()。然后源程序通过另一个 X11 消息返回数据,按需转换为请求的类型。(还有一种特殊类型,它返回可能类型的列表。)

  • 有关实际示例,请参阅此链接

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

在 Wayland - 我实际上并不了解它是如何工作的,我所拥有的只是协议文档:

传统的文本编辑器(Vim、emacs、nano)通常有自己的内部剪贴板(又名寄存器/killrings)。它们可能也可能不与 X11 剪贴板集成。

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

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

图像只是二进制数据块,如文本或音频。剪贴板通常会以操作系统通用的格式保存图像,例如Windows 上的BMP,Linux 上的image/png

Linux 上,X11 剪贴板协议实际上允许一个 X 客户端向其他客户端提供不同的选择“编码”,并且接收 X 客户端可以选择编码,因此发送 X 客户端可以将选择转换为任何格式客户了解。至少在理论上;不确定像 GTK 或 Qt 这样的现代工具包库是否确实提供了很多选择。

  • @AndrewSavinykh *技术上* 这些键盘快捷键必须由特定应用程序解释,然后必须调用适当的 API 来获取数据。但是大多数应用程序依赖于标准框架,这些框架提供了实现这些“标准”键盘快捷键的小部件,例如基本的 [Win32 编辑控件](https://docs.microsoft.com/en-us/windows/desktop/controls/about- edit-controls) 实现了它自己的 Ctrl+C/Ctrl+V 处理。所以:“从头开始”绘制的应用程序必须实现快捷方式处理,而使用现有框架的应用程序通常“免费”获得。 (10认同)
  • 回复:*我不确定这种方法有多普遍*,我只在 Word、Powerpoint 和 Publisher 中注意到它(暗示也许只有 Microsoft 才会费心去实现它)。当您单击应用程序上的关闭时,它会询问您是否要保存剪贴板。我只看到剪贴板上有大(> 1MB)图像时才会发生这种情况。 (3认同)
  • 另请注意,在 Linux 中,CTRL+C 不一定复制文本。在文本终端中,也适用于 GUI 中的终端,CTRL+C 通常被视为终止当前正在运行的进程。 (3认同)
  • @ErinB:这在很大程度上取决于两个程序之间的共同类型......没有什么可以阻止视频编辑器以自己的格式包含所有帧,但通常它只会被同一个程序理解,其他所有人都必须求助于粘贴通用单帧格式。例如,MS Office 数据也是如此。 (2认同)