electron globalShortcut 快捷键,在焦点移到其他软件上时,调用快捷键报错

news2024/11/27 12:44:13

用 electron 开发软件,在设置了 globalShortcut 快捷键后,在当前开发的软件上调用快捷键正常,但是当焦点不在当前软件时,在使用快捷键,好些时候会报错。大概率与系统快捷键产生冲突或者快键键控制的回调里获取的内容,需在软件聚焦时才可获取到。

开始我设置快键键的方式:

function createWindow () {
  // 隐藏窗体顶部菜单
  Menu.setApplicationMenu(null)

  /**
   * Initial window options
   */
  mainWindow = new BrowserWindow({
    width: 1338, // 宽
    height: 839, // 高
    minWidth: 1024,
    minHeight: 600,
    useContentSize: true,
    show: false, // 创建后是否显示
    frame: false, // 添加后自定义标题//自定义边框
    center: true, // 是否出现在屏幕居中的位置
    fullscreenable: platform === 'darwin',
    resizable: false, // 可否缩放
    movable: true, // 可否移动
    maximizable: false,
    minimizable: false,
    title: '当前项目名称', // 默认窗口标题
    transparent: false, // 是否是透明窗口(仅macOS)
    // vibrancy: 'ultra-dark', // 窗口模糊的样式(仅macOS)
    backgroundColor: 'none', // 背景色,用于transparent和frameless窗口
    hasShadow: true, // Boolean (可选) - 窗口是否有阴影. 仅在 macOS 上支持. 默认值为 true
    titleBarStyle: 'hidden',
    webPreferences: {
      nodeIntegration: true,
      webSecurity: false, // electron窗体跨域方案
      backgroundThrottling: false // 当页面被置于非激活窗口的时候是否停止动画和计时器
    }
  })

  mainWindow.setMenu(null) // 隐藏菜单栏
  if (platform === 'darwin') {
    Menu.setApplicationMenu(Menu.buildFromTemplate([]))
  }

  mainWindow.loadURL(winURL)

  mainWindow.on('ready-to-show', function () {
    mainWindow.show() // 初始化后再显示
  })

  mainWindow.on('closed', () => {
    mainWindow = null
  })
}

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

app.on('ready', createWindow)

app.on('activate', () => {
  if (mainWindow === null) {
    createWindow()
  }
})

app.whenReady().then(() => {
  // 设置快捷键
  globalShortcut.register('CommandOrControl+Alt+T', () => {
    const currentWindow = BrowserWindow.getFocusedWindow()
    currentWindow.webContents.openDevTools()
  })
})

app.on('will-quit', () => {
  // 注销所有快捷键
  globalShortcut.unregisterAll()
})

但是这样在失去焦点时,windows和mac下都会报错:

原因是:const currentWindow = BrowserWindow.getFocusedWindow() 方法需在当前软件聚焦时才可正常调用。

将 const currentWindow = BrowserWindow.getFocusedWindow() 改为 mainWindow.webContents.openDevTools()

// 将 const currentWindow = BrowserWindow.getFocusedWindow() 改为以下代码
mainWindow.webContents.openDevTools()

这种改法在windows下正常,但是mac下关闭程序,程序在Dock中还在,这是使用这种方式依然会报错,这是因为我们没有再mac环境下在程序关闭的时候注销快捷键。所以我们需要再window-all-closed补充上mac环境下的处理。

function createWindow () {
  // 隐藏窗体顶部菜单
  Menu.setApplicationMenu(null)

  /**
   * Initial window options
   */
  mainWindow = new BrowserWindow({
    width: 1338, // 宽
    height: 839, // 高
    minWidth: 1024,
    minHeight: 600,
    useContentSize: true,
    show: false, // 创建后是否显示
    frame: false, // 添加后自定义标题//自定义边框
    center: true, // 是否出现在屏幕居中的位置
    fullscreenable: platform === 'darwin',
    resizable: false, // 可否缩放
    movable: true, // 可否移动
    maximizable: false,
    minimizable: false,
    title: '当前项目名称', // 默认窗口标题
    transparent: false, // 是否是透明窗口(仅macOS)
    // vibrancy: 'ultra-dark', // 窗口模糊的样式(仅macOS)
    backgroundColor: 'none', // 背景色,用于transparent和frameless窗口
    hasShadow: true, // Boolean (可选) - 窗口是否有阴影. 仅在 macOS 上支持. 默认值为 true
    titleBarStyle: 'hidden',
    webPreferences: {
      nodeIntegration: true,
      webSecurity: false, // electron窗体跨域方案
      backgroundThrottling: false // 当页面被置于非激活窗口的时候是否停止动画和计时器
    }
  })

  mainWindow.setMenu(null) // 隐藏菜单栏
  if (platform === 'darwin') {
    Menu.setApplicationMenu(Menu.buildFromTemplate([]))
  }

  mainWindow.loadURL(winURL)

  mainWindow.on('ready-to-show', function () {
    mainWindow.show() // 初始化后再显示

    // 注册快捷键
    globalShortcut.register('CommandOrControl+Alt+T', () => {
      mainWindow.webContents.openDevTools()
    })
  })

  mainWindow.on('closed', () => {
    mainWindow = null
  })
}

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    // windows下调用退出方法
    app.quit()
  } else {
    // mac环境注销所有快捷键
    globalShortcut.unregisterAll()
  }
})

app.on('ready', createWindow)

app.on('activate', () => {
  if (mainWindow === null) {
    createWindow()
  }
})

// 退出程序
app.on('will-quit', () => {
  // windows注销所有快捷键
  globalShortcut.unregisterAll()
})

正确逻辑的核心代码:

  mainWindow.on('ready-to-show', function () {
    mainWindow.show() // 初始化后再显示

    // 注册快捷键
    globalShortcut.register('CommandOrControl+Alt+T', () => {
      mainWindow.webContents.openDevTools()
    })
  })

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    // windows下调用退出方法
    app.quit()
  } else {
    // mac环境注销所有快捷键
    globalShortcut.unregisterAll()
  }
})

// 退出程序
app.on('will-quit', () => {
  // windows环境注销所有快捷键
  globalShortcut.unregisterAll()
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/940519.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全新UI站长在线工具箱系统源码带后台开源版

该系统的全开源版本可供下载,并且支持暗黑模式。 系统内置高达72种站长工具、开发工具、娱乐工具等功能。此系统支持本地调用API,同时还自带免费API接口, 是一个多功能性工具程序,支持后台管理、上传插件、添加增减删功能。 环…

行业追踪,2023-08-28

自动复盘 2023-08-28 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

LNMT与动静分离

目录 前言 一、简要思路 二、NGINX的配置参考 1、location 2、rewirte 三、动静分离配置(单机配置) 1、Tomcat配置 2、配置NGINX 3、安装mariadb 4、测试 Tomcat8080​编辑 Tomcat8081 访问不存在的页面 前言 LNMT(Linux Nginx MySQL Tom…

什么是网络取证(Network Forensics)

企业采用新技术来检查其网络安全是否存在零日漏洞,与立即指示问题的物理层不同,黑客攻击尝试可能会被忽视并变得严重,直到对网络流量有一个整体的可见性。通过实时监控来跟踪其源和目标的流量,以查明问题或潜在问题的根源。 什么…

CY3-DBCO活性荧光染料-星戈瑞

​欢迎来到星戈瑞荧光stargraydye!小编带您盘点: CY3-DBCO是一种活性荧光染料,它是由Cyanine3(CY3)荧光染料与DBCO(dibenzocyclooctyne)官能团共轭而成的化合物。 活性荧光染料通常是指具有特定…

Android RecyclerView 之 列表宫格布局的切换

前言 RecyclerView 的使用我就不再多说,接下来的几篇文章主要说一下 RecyclerView 的实用小功能,包括 列表宫格的切换,吸顶效果,多布局效果等,今天这篇文章就来实现一下列表宫格的切换,效果如下 一、数据来…

k8s的交付与部署

一 k8s的概念 1.1 k8s k8s是一个轻量级的,用于管理容器化应用和服务的平台。通过k8s能够进行应用的自动化部署和扩容缩容。 1.2 k8s核心部分 1.prod: 最小的部署单元;一组容器的集合;共享网络;生命周期是短暂的; …

ChatGPT在医疗领域可应用于改善与患者的沟通

注意:本信息仅供参考,发布该内容旨在传递更多信息的目的,并不意味着赞同其观点或证实其说法。 自从ChatGPT在2022年末对公众开放以来,OpenAI的这款生成式AI聊天机器人在医疗领域展示出了巨大潜力。它已经通过了美国医学执照考试&a…

3. 运行时数据区及程序计数器

3.1. 运行时数据区 3.1.1. 概述 本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段 当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会用到执行引擎对我们…

Centos7更新glibc2.18

Centos7更新glibc2.18 查看glibc版本下载解压glibc2.18编译安装结果验证 查看glibc版本 # 查看glibc版本 ldd --version下载解压glibc2.18 参考: https://blog.csdn.net/qq_39295044/article/details/86685789 https://blog.csdn.net/myhes/article/details/106923039 # 下载…

安装配置mariadb

记录下安装配置mariadb的经历。 环境:ubuntu22 一、apt在线安装 apt代理配置 APT是Ubuntu系统中用于安装和升级软件包的工具,如果本地没有可用的软件包,APT将会连接到远程软件包服务器下载软件包。在某些情况下,用户需要将APT的…

UE5- socket客户端写法

# 实现目标 ue5 c 实现socket客户端,读取服务端数据,并进行解析 #实现步骤 {projectName}.Build.cs里增加 "WebSockets","JsonUtilities", "Json"配置信息,最终输出如下: using UnrealBuildTool;…

msvcr110.dll怎么安装?多种方法教你快速修复msvcr110.dll文件

最近很多小伙伴在咨询,msvcr110.dll怎么安装这个问题,其实要安装这个还是比较简单的,而且方法有很多种,每一种方法都有各种的优势,我们只要选择适合我们的一种方法就可以了。好了,下面我们一起来了解一下快…

微信小程序云开发-云存储文件ID转http

一、前言 云开发的云储存文件默认是以cloudID的形式读取的,但是这种读取方式只能在微信小程序或内嵌H5中使用。 所以如果需要在其他地方使用,例如浏览器或网站等其他端读取文件的时候,需要转换成普通的http链接。 目前官方提供有转换的接口…

智慧矿山2.0:煤矿智能化综合管理AI大数据监管平台建设方案设计

一、行业背景 能源与煤矿是我国国民经济的重要物质生产部门和支柱产业之一,同时也是一个安全事故多发的高危行业,施工阶段的现场管理对工程成本、进度、质量及安全等至关重要。煤矿智能化既是未来趋势,更是产业发展需求,建设智慧…

五个技巧,助你有效管理员工信息

对于大多数人力资源部门来说,在时间表、工资单记录和绩效评估之间管理员工信息是一项艰巨的任务。要做到正确管理并不那么容易,尤其是对于员工人数众多的企业而言。 本文提供了有效管理员工信息的关键技巧。无论是小企业主还是人力资源专业人员&#xf…

简单明了的Git入门

一、下载安装git 1、根据连接下载 git-scm.com 一路点击“下一步”,然后取消“view Release Notes” 二、配置git 安装成功后,鼠标右键点击第二个“Git” 配置用户名 git config --global user.name Mihu 配置邮箱(注意:这个…

Wiki在企业内部的应用和管理,如何构建有效的Wiki系统?

Wiki 是一个协同著作平台或称开放编辑系统。我们可以用Wiki来建设帮助系统,知识库系统。国内公共wiki最著名就是百度百科,国外则是基维百科;Wiki最著名的例子之一是维基百科,它在MediaWiki上运行,任何拥有Web浏览器的人…

东盟全面覆盖?长城战略部署核心区域市场,首个百万粉丝国产品牌

根据最新消息,长城汽车在东南亚地区取得了巨大的成功,成功进军了亚洲最大的汽车市场之一-印度尼西亚。这标志着长城汽车已经实现了东盟核心市场的全面覆盖,成为全球布局的重要一步。 在过去的几年里,长城汽车在东盟地区的市场布局…