【Electron】解决mac系统无法复制粘贴的问题

1,227 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

一、前言

本篇文章主要介绍如何解决mac系统中electron应用无法使用复制、粘贴、全选等功能的问题。这种情况一般发生在mac系统中的生产环境之中,electron应用自定义了菜单中没有相关功能操作或者是直接没得了菜单。本篇文章主要讲解三种方法解决此问题。

二、解决方案

1.方案一(设置菜单项)

在electron的Menu模块中,就存在复制和粘贴功能,也会自动注册相关菜单快捷键。通过设置菜单项MenuItem,使用其中的role来实现相关指令功能。以下内容为关于role的相关介绍,点击查看全部介绍

role可以通过角色来为menu添加预定义行为。

最好给任何一个菜单指定 role去匹配一个标准角色, 而不是尝试在 click 函数中手动实现该行为。 内置的 role 行为将提供最佳的原生体验。

使用 role 时, label 和 accelerator 值是可选的, 并为每个平台,将默认为适当值。

每个菜单项必须有一个 rolelabel, 或者一个分隔符一个 type

role 属性可以具有以下值:

  • undo - 撤销。
  • about - 触发原生信息面板 (在 Window 中自定义消息盒子, 本身不提供).
  • redo
  • cut - 剪切。
  • copy - 复制。
  • paste - 粘贴。
  • pasteAndMatchStyle
  • selectAll - 全选。
  • delete -删除
  • minimize - 最小化当前窗口。
  • close - 关闭当前窗口
  • quit - 退出程序
  • reload - 重新加载当前窗口。
  • forcereload - 忽略缓存,重新加载当前窗口。
  • toggledevtools - 在当前窗口中隐藏/显示开发者工具。
  • togglefullscreen - 将当前窗口切换至全屏模式。
  • resetzoom - 将主页的缩放级别重置为初始大小.
  • zoomin - 主页面放大 10%.
  • zoomout -主页面缩小 10%.
  • toggleSpellChecker - 启用/禁用内置拼写检查器。
  • fileMenu - 默认的“文件”菜单(关闭/退出)
  • editMenu-默认的 "编辑" 菜单 (包括撤消、复制等)
  • viewMenu - 默认的“视图”菜单(包括重新加载、开发者工具等)
  • windowMenu - 默认的“窗口”菜单(包括最小化、缩放等)

在 macOS 上指定 role 时, label 和 accelerator 是影响菜单项的唯一选项。 所有其它选项都将被忽略。 不过,仍然支持小写的role,如toggledevtools

注意:  对于托盘上的顶级菜单项不可用的 enabled 和 visibility 属性

实现方式代码如下

// 主进程中

// 设置菜单栏
import { Menu } from 'electron'
function createMenu () {
  // darwin表示macOS,针对macOS的设置  process.platform === 'darwin'
  if (process.platform === 'darwin') {
    const template = [{
      label: '我的应用',
      submenu: [
        { label: '关于', accelerator: 'CmdOrCtrl+I', role: 'about' },
        { type: 'separator' },
        { label: '隐藏', role: 'hide' },
        { label: '隐藏其他', role: 'hideOthers' },
        { type: 'separator' },
        { label: '服务', role: 'services' },
        { label: '退出', accelerator: 'Command+Q',role: 'quit' }
      ]
    },
    {
      label: '编辑',
      submenu: [
        { label: '复制', accelerator: 'CmdOrCtrl+C', role: 'copy' },
        { label: '粘贴', accelerator: 'CmdOrCtrl+V', role: 'paste' },
        { label: '剪切', accelerator: 'CmdOrCtrl+X', role: 'cut' },
        { label: '撤销', accelerator: 'CmdOrCtrl+Z', role: 'undo' },
        { label: '重做', accelerator: 'Shift+CmdOrCtrl+Z', role: 'redo' },
        { label: '全选', accelerator: 'CmdOrCtrl+A', role: 'selectAll' }
      ]
    }]
    const menu = Menu.buildFromTemplate(template)
    Menu.setApplicationMenu(menu)
  } else {
    // windows及linux系统
    Menu.setApplicationMenu(null)
  }
}
createMenu()

方案二、设置全局快捷键(不推荐)

这个方案是通过electron的globalShortcut来设置全局快捷键。但是这种方式会致使其他的应用的次快捷键失效,或其他问题。如下代码所示

import { globalShortcut } from 'electron'
globalShortcut.register( CommandOrControl+C, () => {
    win.webContents.copy()
});

方案三、设置本地快捷键

这里就需要引入第三方库electron-localshortcut,来实现本地快捷键,何为本地快捷键呢,即在当前应用获取焦点的时候,快捷键生效;失去焦点时,快捷键失效。点击查看文档

const electronLocalshortcut = require('electron-localshortcut');
const BrowserWindow = require('electron').BrowserWindow;

const win = new BrowserWindow();
win.loadUrl('https://github.com');
win.show();

electronLocalshortcut.register(win, 'Ctrl+C', () => {
   win.webContents.copy()
});

以上就是解决mac系统无法复制粘贴的问题三种方案。推荐一、三两种。

三、后记

在实际开发中,可以根据是否需要mac系统中的菜单项,来决定使用一、三哪种方案。

本篇完结! 撒花! 感谢观看! 希望能帮助到你!