复制粘贴怎么可能?

How is copy paste possible?

我想知道在使用计算机很长时间后,感觉复制粘贴是基本功能,但我知道它不是。所以问题是这到底是如何工作的?

我想到了所有如何实现它的想法,但每次我想到 gif、jpg、txt、png、mp3、mp4、JSON、YML 等不同的文件格式时,我都会卡住等等,你走得越远,它就越复杂,比如快捷方式、链接,然后是目录。就像它如何复制 chrome 中搜索结果中的图像,而有时由于限制你不能复制某些东西,你也不能 select 某些东西然后你不能复制它,而有时即使您不能 select 在层次结构中复制子项,因此它是如何实现的。

但是当有人问我复制粘贴通常如何工作时,我会这样回答:当复制某些内容时,它将复制的项目放入内存中,当将其粘贴到 OS 找到的某个地方时将位置复制到应该复制的位置并将所有文件复制为二进制文件并复制它。

这可能不是真的,所以你能解释一下它是如何工作的吗?了解复制粘贴代码的编写方式也很有帮助。

您首先需要了解的是,“复制和粘贴”以及“拖放”都是 IPC(进程间通信)的一种形式,因为数据是从一个应用程序传输到另一个应用程序。这种机制通常由负责管理图形用户界面的同一个子系统或服务提供。

此子系统为“源”和“目标”应用程序提供了一种机制,用于协商应传输的数据格式,如果它们“同意”某种通用格式,则可以传输数据。

一个例子来说明这个概念:

  1. 用户在网络浏览器中选择文本并按 Ctrl+C。
  2. 浏览器告诉窗口系统它有一些数据可供复制。 请注意,此步骤不会复制任何数据。
  3. 用户打开文本编辑器并按 Ctrl+V。
  4. 文本编辑器告诉窗口系统以纯文本格式向它提供剪贴板上的内容
  5. Windowing 系统告诉浏览器以纯文本格式提供其共享数据
  6. 浏览器将其数据从 HTML(或其他) 转换为 纯文本 并将其传输到文本通过窗口系统编辑。 请注意,这种转换并非总是可行(取决于格式和应用程序),因此您有时无法粘贴复制的数据。

技术细节

  • 在 Windows 上,此功能是通过 Clipboard API 提供的,正如 Ken White 提到的那样。
  • 在 Linux(可能在其他任何地方),剪贴板功能严格来说并不是 OS 的一部分,而是由 Window Server/Manager(其中实际上只是一个服务进程)通过窗口系统协议,例如 X protocol or Wayland.