我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

春风吹,战鼓擂,都是屌丝谁怕谁。本文是前面某篇文章的续文,讲述的是,关于mac版的electron程序,无法复制文字的解决方案。上次的文章中,苏南大叔提出的是个临时解决方案。在本文中,苏南大叔提出的是个非常完美的解决方案。个人觉得是相当完美,分享给大家。

苏南大叔:electron程序,mac系统无法复制文字的终极解决方案 - electron-mac-copy-issue
electron程序,mac系统无法复制文字的终极解决方案(图3-1)

本文测试环境:mac/electron@5.0.7。注意:本文说的是mac下的electron程序,在生产模式下,会有不能复制粘贴的问题。其它的使用场景,目前来说,是没有类似问题的。请注意!测试环境与苏南大叔描述的是否一致!本文是通过注册快捷键的方法,实现的复制粘贴的目的,并没有右键菜单。请知悉!

全局快捷键 vs 本地快捷键

electron官方提供的是globalShortcut全局快捷键。当然,这个全局的快捷键在实际应用中,是会有诸多不变的。详情可以点击下面的文章:

const { globalShortcut } = require('electron')
globalShortcut.register('f12', (event, arg) => {
  //... 
})

第三方的localShortcut本地快捷键,其实功能非常不错,使用方便。但是需要安装第三方代码库,详情请参见:

const localshortcut = require('electron-localshortcut');
localshortcut.register(mainWindow, 'f12', () => {
    //...
});

全局快捷键和本地快捷键相比较的话,苏南大叔个人更倾向于使用后者localShortcut,但是需要额外安装一个第三方代码库electron-localshortcut

webContents对象

这个是渲染进程中的webContents,在使用菜单快捷键的方案中,那些默认的copy()paste()等操作,都是可以在webContents上找到原型的。更多详情可以参见:

在本文的需求中,苏南大叔更关注的功能是:

  • 全选:mainWindow.webContents.selectAll()
  • 复制:mainWindow.webContents.copy()
  • 粘贴:mainWindow.webContents.paste()

避免重复注册(可选)

大家都知道,在electron的开发阶段,顶部会默认出现相关菜单。其中就存在复制和粘贴功能,也会自动注册相关菜单快捷键。那么,对于开发阶段来说,需要把默认的复制粘贴快捷键给去除,避免多次注册快捷键。

Menu.setApplicationMenu(Menu.buildFromTemplate([]))

这个清空顶部系统菜单的操作,就需要看着您的真实需求来编写代码了,千万别照抄啊。

最终代码

使用本地快捷键还是使用全局快捷键,这个就是仁者见仁智者见智的事情了。大家自行选择:

使用本地快捷键

const {app, BrowserWindow, Menu} = require('electron')
app.on('ready', () => {
  if (process.platform === "darwin") {
    Menu.setApplicationMenu(Menu.buildFromTemplate([]))
    let contents = mainWindow.webContents;
    const localShortcut = require('electron-localshortcut');
    localShortcut.register(mainWindow, "CommandOrControl+A", () => {
      contents.selectAll();
    });
    localShortcut.register(mainWindow, "CommandOrControl+C", () => {
      contents.copy();
    });
    localShortcut.register(mainWindow, "CommandOrControl+V", () => {
      contents.paste();
    });
  }
})

苏南大叔:electron程序,mac系统无法复制文字的终极解决方案 - localshortcut-code
electron程序,mac系统无法复制文字的终极解决方案(图3-2)

使用全局快捷键

当然,如果您选用全局快捷键注册的话,代码可能就是下面的样子:

//const {app, BrowserWindow, Menu, globalShortcut} = require('electron')
app.on('ready', () => {
  if (process.platform === "darwin") {
    Menu.setApplicationMenu(Menu.buildFromTemplate([]))
    let contents = mainWindow.webContents;
    globalShortcut.register("CommandOrControl+A", () => {
      contents.selectAll();
    });
    globalShortcut.register("CommandOrControl+C", () => {
      contents.copy();
    });
    globalShortcut.register("CommandOrControl+V", () => {
      contents.paste();
    });
  }
})
注意:这个全局快捷键,可能会导致开着这个特制的electron程序的时候,在其它软件里面,无法复制粘贴。

苏南大叔:electron程序,mac系统无法复制文字的终极解决方案 - globalshortcut-code
electron程序,mac系统无法复制文字的终极解决方案(图3-3)

相关链接

使用注入菜单的方式,实现复制粘贴功能的方案:

总结

在本文中,苏南大叔利用electron-localShortcut为生产模式的mac系统下的electron程序,创建了几个粘贴复制的快捷键,该解决方案算是比较完美的,欢迎大家转载评论。

更多苏南大叔提供的electron相关经验文字,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   electron