AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1436622
Accepted
Inter Sys
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 1 个回答
  • 15252 Views

1 个回答

  • Voted
  1. 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”目标)。

    • 168

相关问题

  • CPU/PC 冻结(温度?)

  • 可以读取硬盘驱动器并专门写入 RAM 的系统?

  • 购买合适的笔记本电脑 RAM [关闭]

  • RAM 安装顺序。8GB 和 16GB。哪个应该在插槽 0 中?

  • CPU、内存还是主板?(PEBCAK!)

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    Windows 10 服务称为 AarSvc_70f961。它是什么,我该如何禁用它?

    • 2 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Marko Smith

    ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:无法获取本地颁发者证书 (_ssl.c:1056)

    • 4 个回答
  • Marko Smith

    我如何知道 Windows 安装在哪个驱动器上?

    • 6 个回答
  • Martin Hope
    Albin 支持结束后如何激活 WindowsXP? 2019-11-18 03:50:17 +0800 CST
  • Martin Hope
    fixer1234 “HTTPS Everywhere”仍然相关吗? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    Kagaratsch Windows 10 删除大量小文件的速度非常慢。有什么办法可以加快速度吗? 2019-09-23 06:05:43 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    Inter Sys Ctrl+C 和 Ctrl+V 是如何工作的? 2019-05-15 02:51:21 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve