持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
一、前言
本篇文章主要介绍如何解决mac系统中electron应用无法使用复制、粘贴、全选等功能的问题。这种情况一般发生在mac系统中的生产环境之中,electron应用自定义了菜单中没有相关功能操作或者是直接没得了菜单。本篇文章主要讲解三种方法解决此问题。
二、解决方案
1.方案一(设置菜单项)
在electron的Menu模块中,就存在复制和粘贴功能,也会自动注册相关菜单快捷键。通过设置菜单项MenuItem
,使用其中的role来实现相关指令功能。以下内容为关于role的相关介绍,点击查看全部介绍
role
可以通过角色来为menu添加预定义行为。
最好给任何一个菜单指定 role
去匹配一个标准角色, 而不是尝试在 click
函数中手动实现该行为。 内置的 role
行为将提供最佳的原生体验。
使用 role
时, label
和 accelerator
值是可选的, 并为每个平台,将默认为适当值。
每个菜单项必须有一个 role
, label
, 或者一个分隔符一个 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系统中的菜单项,来决定使用一、三哪种方案。
本篇完结! 撒花! 感谢观看! 希望能帮助到你!