跳转至

clipboard

<!-- ``YAML history deprecated: - pr-url: https://github.com/electron/electron/pull/48877 description: "Using theclipboard` API directly in the renderer process is deprecated." breaking-changes-header: deprecated-clipboard-api-access-from-renderer-processes

-->

> 对系统剪贴板执行复制和粘贴操作。

进程:[主进程](../glossary.md#main-process)

`clipboard` 模块以 [W3C Clipboard API](https://w3c.github.io/clipboard-apis/#clipboard-interface) 为模型:
`clipboard.read()` 返回一个 `Promise`,解析为 [`ClipboardItem`](clipboard-item.md) 对象列表,而 `clipboard.write()`
接受一个 `ClipboardItem` 实例数组,这些实例将 [MIME 类型](https://developer.mozilla.org/en-US/docs/Web/HTTP/MIME_types)
映射到 [Blob](https://developer.mozilla.org/en-US/docs/Web/API/Blob) 负载。

除了标准 MIME 类型(`text/plain`、`text/html`、
`text/rtf`、`image/png`、`image/jpeg`、…)之外,Electron 还暴露了一组
自定义格式,以便剪贴板可以承载桌面特定的负载。这些格式遵循 W3C
[自定义格式提案](https://github.com/w3c/editing/blob/gh-pages/docs/clipboard-pickling/explainer.md#custom-formats),
使用 `electron` 前缀而不是 `web` 以避免冲突。Electron
暴露的自定义格式包括:

* `electron application/bookmark` — URL 书签。与其他所有
  MIME 类型/自定义格式不同,其负载在写入和读取两侧都是 [ClipboardBookmark](structures/clipboard-bookmark.md) 对象,
  而不是 `Blob`,因此
  `getType('electron application/bookmark')` 解析为
  `{ title: string, url: string }`。
* `electron application/findtext`(_macOS_)— 当前活动应用的
  查找粘贴板内容。
* `electron application/osclipboard;format="<name>"` — 平台特定剪贴板格式的原始负载。
  `<name>` 是平台格式(例如 Windows 上的 `HTML Format` 或
  macOS 上的 `public.utf8-plain-text`)。`clipboard.read()` 还会通过此自定义格式暴露
  任何没有标准 MIME 映射的平台剪贴板格式,因此原始系统格式在写入和读取时通过同一字符串
  往返。

除众所周知的 MIME 类型外,`clipboard.read()` 和
`clipboard.write()` 都接受任意 MIME 类型,包括以
`web` 前缀开头(后跟一个空格,例如 `web application/x.my-format`)
并遵循 W3C [web 自定义格式提案](https://github.com/w3c/editing/blob/gh-pages/docs/clipboard-pickling/explainer.md#custom-formats) 的自定义格式。

```js
const { clipboard, ClipboardItem } = require('electron')

async function writeClipboard () {
  await clipboard.write([
    new ClipboardItem({
      'web application/x.my-app-clip': new Blob(['arbitrary payload'])
    })
  ])
}

writeClipboard()

在 Linux 上还有一个 selection 剪贴板。它通过 clipboard.selection 子命名空间暴露, 该子命名空间镜像顶层 clipboard 接口。 selection 剪贴板针对选择剪贴板而不是系统剪贴板进行操作。

它暴露了与顶层 clipboard 模块相同的接口,但 每个方法都针对选择剪贴板而不是系统剪贴板。这两个剪贴板相互独立:通过 clipboard.selection 写入不会影响 clipboard.read() 返回的数据 (反之亦然)。

[!NOTE] selection 剪贴板不支持 W3C web 自定义格式。

const { clipboard } = require('electron')

async function run () {
  await clipboard.selection.writeText('Example string')
  console.log(await clipboard.selection.readText())
}

run()

方法

clipboard 模块具有以下方法。

clipboard.readText()

返回 Promise<string> - 一个解析为剪贴板内容(纯文本)的 Promise。以 W3C navigator.clipboard.readText API 为模型。

const { clipboard } = require('electron')

async function readText () {
  await clipboard.writeText('hello i am a bit of text!')
  const text = await clipboard.readText()
  console.log(text)
  // 'hello i am a bit of text!'
}

readText()

clipboard.writeText(text)

  • text 字符串

返回 Promise<void> - 一个在文本写入剪贴板后解析的 Promise。以 W3C navigator.clipboard.writeText API 为模型。

const { clipboard } = require('electron')

async function writeClipboardText () {
  await clipboard.writeText('hello i am a bit of text!')
}

writeClipboardText()

clipboard.read()

返回 Promise<ClipboardItem[]> - 一个解析为包含剪贴板内容的 ClipboardItem 对象数组的 Promise。

const { clipboard } = require('electron')

async function dumpClipboard () {
  const items = await clipboard.read()
  for (const item of items) {
    for (const type of item.types) {
      const blob = await item.getType(type)
      console.log(type, blob)
    }
  }
}

dumpClipboard()

clipboard.write(data)

返回 Promise<void> - 在数据写入剪贴板后解析。单次 write() 调用中提供的所有条目都会原子性地提交到系统剪贴板。

const { clipboard, ClipboardItem, nativeImage } = require('electron')

const png = nativeImage.createFromPath('/path/to/icon.png').toPNG()

async function writeClipboard () {
  await clipboard.write([
    new ClipboardItem({
      'text/plain': 'hello',
      'text/html': '<b>hello</b>',
      'image/png': new Blob([png], { type: 'image/png' }),
      'electron application/bookmark': {
        title: 'Electron',
        url: 'https://electronjs.org'
      }
    })
  ])
}

writeClipboard()

clipboard.has(mimetype)

  • mimetype string - 要检查的 MIME 类型

返回 Promise<boolean> - 一个 Promise,如果剪贴板包含指定 mimetype 的数据,则以 true 解析,否则为 false。要检查原始格式,例如 public/utf8-plain-text,请使用 electron application/osclipboard 自定义格式(electron application/osclipboard;format="public/utf8-plain-text")。

const { clipboard } = require('electron')

async function check () {
  const hasFormat = await clipboard.has('text/html')
  console.log(hasFormat)
  // 'true' or 'false'
  const rawFormat = 'electron application/osclipboard;format="public/utf8-plain-text"'
  const hasRawFormat = await clipboard.has(rawFormat)
}

check()

clipboard.clear()

清除剪贴板内容。

属性

clipboard.selection Linux 只读

Clipboard 属性 — 在 Linux 上,这是一个 Clipboard 对象,它操作的是选择剪贴板而不是系统剪贴板;在所有其他平台上为 undefined。它暴露了与顶层 clipboard 模块相同的 read、write、readText、writeText、has 和 clear 方法。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 el/electron