Inter Sys Asked: 2019-05-15 02:51:21 +0800 CST2019-05-15 02:51:21 +0800 CST 2019-05-15 02:51:21 +0800 CST Ctrl+C 和 Ctrl+V 是如何工作的? 772 Ctrl例如,当我将图像复制(选择并使用+ C)到 Word 文件(使用 + 粘贴Ctrl)时,我一直想知道引擎盖下(在操作系统中)会发生什么V。 memory paste 1 个回答 Voted Best Answer user1686 2019-05-15T04:24:37+08:002019-05-15T04:24:37+08:00 所有系统的一个共同点是键盘快捷键(例如)CtrlC不是系统级的——它们由每个程序单独处理,就像“复制”或“粘贴”菜单项是特定于每个程序的一样。因此,“复制”某些内容的不是操作系统本身,而是使用某些特定于操作系统的功能将数据放入全局剪贴板的应用程序 (Word)。 视窗 在 Windows 中,剪贴板 API 和存储缓冲区由操作系统在内核级别提供。(剪贴板属于“窗口站”内核对象。) 当你“复制”一些东西时,程序会使用 Win32 API 函数存储“复制”的数据,这在 Native APISetClipboardData()中也是对应的。NtUserSetClipboardData() 通常复制的数据会立即存储在操作系统管理的剪贴板缓冲区中,不再依赖于源程序。该程序可以提供多种不同的格式——例如,除了 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 中是如何工作的,我所拥有的只是协议文档: https://wayland.freedesktop.org/docs/html/ch04.html#sect-Protocol-data-sharing https://wayland.freedesktop.org/docs/html/apa.html#protocol-spec-wl_data_device 有关命令行工具,请参阅https://github.com/bugaevc/wl-clipboard。 非图形程序 传统的文本编辑器(Vim、emacs、nano)通常有自己的内部剪贴板(又名寄存器/killrings)。 如果在图形终端模拟器中运行,基于终端的应用程序可以访问 X11 或 Wayland 剪贴板,例如 Vim 的"+寄存器将从 X11 剪贴板粘贴(而其他 Vim 寄存器在程序内部)。 macOS(Mac OS X) 在 macOS 中,似乎使用了一种叫做“粘贴板服务器”的东西(我认为这意味着程序通过 Mach API 与之通信)。除此之外,它的行为类似于 Windows 剪贴板并存储当前复制的数据本身。 https://developer.apple.com/documentation/appkit/nspasteboard 有一个示例应用程序:https ://developer.apple.com/library/archive/samplecode/ClipboardViewer/Introduction/Intro.html 我对图像更感兴趣,它们怎么可以这么容易被复制 图像没有什么特别的——它们仍然只是可以表示为字节的二进制数据块,所以如果它们可以保存在文件中(例如 PNG 或 JPEG 格式),它们也可以存储在剪贴板中使用相同的格式。 Windows 应用程序通常以 BMP/DIB 格式(与 .bmp 文件相同)存储复制的图像,而在 Linux 上,应用程序通常提供 PNG(即“图像/png”目标)。
所有系统的一个共同点是键盘快捷键(例如)CtrlC不是系统级的——它们由每个程序单独处理,就像“复制”或“粘贴”菜单项是特定于每个程序的一样。因此,“复制”某些内容的不是操作系统本身,而是使用某些特定于操作系统的功能将数据放入全局剪贴板的应用程序 (Word)。
视窗
在 Windows 中,剪贴板 API 和存储缓冲区由操作系统在内核级别提供。(剪贴板属于“窗口站”内核对象。)
当你“复制”一些东西时,程序会使用 Win32 API 函数存储“复制”的数据,这在 Native API
SetClipboardData()
中也是对应的。NtUserSetClipboardData()
通常复制的数据会立即存储在操作系统管理的剪贴板缓冲区中,不再依赖于源程序。该程序可以提供多种不同的格式——例如,除了 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 中是如何工作的,我所拥有的只是协议文档:
https://wayland.freedesktop.org/docs/html/ch04.html#sect-Protocol-data-sharing
https://wayland.freedesktop.org/docs/html/apa.html#protocol-spec-wl_data_device
有关命令行工具,请参阅https://github.com/bugaevc/wl-clipboard。
非图形程序
传统的文本编辑器(Vim、emacs、nano)通常有自己的内部剪贴板(又名寄存器/killrings)。
如果在图形终端模拟器中运行,基于终端的应用程序可以访问 X11 或 Wayland 剪贴板,例如 Vim 的
"+
寄存器将从 X11 剪贴板粘贴(而其他 Vim 寄存器在程序内部)。macOS(Mac OS X)
在 macOS 中,似乎使用了一种叫做“粘贴板服务器”的东西(我认为这意味着程序通过 Mach API 与之通信)。除此之外,它的行为类似于 Windows 剪贴板并存储当前复制的数据本身。
https://developer.apple.com/documentation/appkit/nspasteboard
有一个示例应用程序:https ://developer.apple.com/library/archive/samplecode/ClipboardViewer/Introduction/Intro.html
图像没有什么特别的——它们仍然只是可以表示为字节的二进制数据块,所以如果它们可以保存在文件中(例如 PNG 或 JPEG 格式),它们也可以存储在剪贴板中使用相同的格式。
Windows 应用程序通常以 BMP/DIB 格式(与 .bmp 文件相同)存储复制的图像,而在 Linux 上,应用程序通常提供 PNG(即“图像/png”目标)。