electron在单例中实现双击打开文件,并重复打开其他文件

单实例的思路

  1. 首次通过双击文件打开应用
    • filePath传给render
  2. 使用中的应用,再次双击打开文件
    • 第一个实例创建时,同时创建一个通信服务器net.createServer()
    • 第二个实例创建时,连接第一个服务器net.createConnection()
    • 将再次打开的filePath传递给第一个实例
    • 然后在传递给render

1. 首次通过双击文件打开应用

在主进程展示的时候传递filePath

  mainWindow.on('ready-to-show', () => {//隐藏启动页if (loadingWindow && !loadingWindow?.isDestroyed()) {loadingWindow?.hide()loadingWindow?.removeAllListeners()loadingWindow?.destroy()}mainWindow.show()/*** @description 双击打开本地文件*/openFileFromDoubleClick(mainWindow)})

获取filePath并传递给render

export function openFileFromDoubleClick(mainWindow) {if (process.argv.length >= 2) {const argv = process.argv.slice(app.isPackaged ? 1 : 2)const filePath =argv.find((arg) => arg.endsWith('.krzj')) ||argv.find((arg) => arg.includes('--file'))?.split('=')[1]if (filePath && filePath.endsWith('.krzj')) {// 当页面加载完成后,获取到vue-ready事件后,发送open-file事件ipcMain.once('vue-ready', () => {mainWindow.webContents.send('open-file', filePath)})}}
}

2. 注册preload事件

 //双击打开文件onOpenFile: (callback: any) => ipcRenderer.on('open-file', callback),//消息传递send: (channel, data) => ipcRenderer.send(channel, data),

3. render接收信息

需要先通知主进程render加载完毕,才从主进程拿filePath,否则获取不到

onMounted(() => {// 在health接口返回后 获取双击打开的文件路径window.api.send('vue-ready')window.api.onOpenFile((event: any, path: string) => {if (path && route.path === '/file') {// 在当前页直接获取跳转openProjectFile(path)} else if (path && route.path !== '/file') {// 在非当前页则回来后获取跳转router.push('/file')openProjectFile(path)}})
})

4. 主进程创建通信服务器

// 锁定应用只能单列运行
const appSingleInstance = app.requestSingleInstanceLock()
if (!appSingleInstance) {// 第二个实例 - 连接第一个实例的服务器sendFilePathToFisrtInstance(PORT)app.quit()
} else {// 第一个实例 - 创建服务器 获取第二个实例发送的filepath 封装后不能再发送server = net.createServer((socket) => {socket.on('data', (data) => {mainWindow?.webContents.send('open-file', data.toString())})})server.listen(PORT)server.on('error', (err) => console.error('服务器错误:', err))
}

5. 第二个实例连接服务器

/*** @description 第二个实例 - 连接第一个实例的服务器* @export*/
export function sendFilePathToFisrtInstance(port: number) {const argv = process.argv.slice(app.isPackaged ? 1 : 2)const filePath =argv.find((arg) => arg.endsWith('.krzj')) ||argv.find((arg) => arg.includes('--file'))?.split('=')[1]if (filePath) {const client = net.createConnection({ port: port }, () => {client.write(filePath)client.end()})client.on('error', () => {})}
}

开发时如何本地测试打开多个文件

使用的是electron-vite,在package.json创建运行脚本,一条就是打开一个文件,可以开多个终端打开多个文件

 "open-file": "electron-vite dev -- --file \"D:/kr/untitled01.krzj\"","open-file1": "electron-vite dev -- --file \"D:/kr/untitled02.krzj\"","open-file2": "electron-vite dev -- --file \"D:/kr/untitled03.krzj\""

windows如何关联自定义文件关联启动

我是用的是electron-builder,然后在electron-builder.yml中配置就行,非常简单

# 设置自定义文件关联启动
fileAssociations:description: kingrayFile# 自定义文件后缀ext: krzj# 自定义文件图标icon: build/icons/win/icon.ico

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

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

相关文章

一、基础架构层:高性能引擎基石

1. ECS架构工业级实现 // EnTT实战示例:导弹系统组件定义 struct Position { vec3 value; }; struct Velocity { vec3 value; }; struct ExplodeWhen { float distance; };entt::registry registry;// 实体创建与组件绑定 auto missile registry.create(); regist…

rockylinuxapache和Linux服务配置

目录 apache nginx 反向代理配置[rootk8s2 ~]# [rootk8s2 ~]# cat /etc/nginx/conf.d/webserver.confserver { listen 80; server_name www.sxy1.com; location / { root /var/www/html; index index.html; } location /py/{ …

ai 幻觉

ai幻觉: 感知人类观察者不存在或无法感知的模式或对象,从而产生无意义或完全不准确的输出 有时 AI 算法会生成并非基于训练数据的输出结果,继而被转换器错误解码或不遵循任何可识别的模式。换句话说,它会在给出响应时“产生幻觉” 致因:训练…

freeRTOS移植实验

提示:文章 文章目录 前言一、背景第6章节 二、2.12.2 三、3.1 总结 前言 前期疑问: 本文目标: 一、背景 在家里先使用野火网盘资料里的freeRTOS源码,网盘里是v9.0.0。 J:\野火\STM32F103ZET6_霸道开发板\A盘(资料盘…

食品加工温控场景:PROFIBUS转MODBUS的温控表连接规范

在现代的工业自动化领域里,实现不同通信协议设备间无缝对接的技术日益受到重视。这不仅关乎系统整合性和效率的提升,更是实现复杂工业过程自动化的必经之路。特别是在众多的通信协议中,MODBUS和PROFIBUS这两种广泛使用的协议因其各自的优势而…

【动态规划】回文串(二)

📝前言说明: 本专栏主要记录本人的动态规划算法学习以及LeetCode刷题记录,按专题划分每题主要记录:(1)本人解法 本人屎山代码;(2)优质解法 优质代码;&…

Ubuntu22.04.5 桌面版然后安装 VMware 17

安装 VMware 需要 GCC 12版本 标题通过 PPA 安装 这是最简单的方法,适用于大多数 Ubuntu 版本。 步骤 1:添加 PPA 仓库 sudo apt update sudo apt install software-properties-common sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt…

深入解析 MySQL 架构:从基础到高级

MySQL 是一款广泛使用的开源关系型数据库管理系统,以其高性能、可靠性和灵活性而闻名。无论是小型创业公司还是大型企业,MySQL 都是许多应用程序的首选数据库解决方案。本文将深入探讨 MySQL 的架构设计,帮助读者更好地理解其内部工作机制&am…

BACnet协议移植适配实现BACnet/IP和BACnet MSTP相关功能

1、从GitHub或者其他网站下载最新的协议栈源码 源码结构如图所示: 其中src是协议栈源码,可直接拿来使用,apps里面是一些功能的应用示例,有BACnet IP,BACnet MSTP,BACnet Router等功能。 2、协议栈移植完成…

Ubuntu 22.04.1 LTS 离线安装Docker(最快方法,仅需一个压缩文件和两个脚本)

作者亲测:亲测有效无bug。 利用ubuntu22.04下载完docker-27.4.1.tgz,然后按照下面方法安装。选择sudo方法。 tips:这个ubuntu22.04是迁移后的服务器的版本,不是迁移前的版本。 下载 下载地址 : https://download.docker.com/linux/static/stable/x86_…

Tkinter --按钮点击事件应用场景

第二章 事件处理 目录 第二章 事件处理 四、事件处理 4.1 按钮点击事件 4.1.1信息展示类场景 1. 静态文本说明 ​编辑 2. 动态状态显示 4.1.2.界面美化与装饰 1. 图像 / 图标展示 ​编辑 2. 分隔与布局辅助 4.1.3 交互反馈与提示 1. 操作结果提示 2. 帮助与说明文本…

计算机网络学习笔记:TCP流控、拥塞控制

文章目录 前言一、TCP流量控制1.1、案例:三次流量控制1.2、持续计时器 二、TCP拥塞控制2.1、拥塞控制的指标2.2、慢开始算法和拥塞避免算法2.3、快重传算法和快恢复算法2.4、练习 三、TCP拥塞控制与网际层拥塞控制总结 前言 TCP协议中的流量和拥塞,是两个…

【Linux】Tomcat搭建

前言 Tomcat Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。 JSP JSP是一种跨平台的动态网页技术标准,可以…

Ajax 核心知识点全面总结

文章目录 Ajax 核心知识点全面总结一、Ajax 基础概念1、定义2、核心特点 二、Ajax 工作原理与核心组件1、工作流程2、XMLHttpRequest(XHR)对象 三、Ajax 请求方法与参数1、常见请求方法2、请求参数处理 四、Ajax 异步与错误处理1、异步处理2、错误处理 五…

SpinFlowSim:用于癌症组织学信息驱动的扩散MRI微血管映射的血流模拟框架|文献速递-深度学习医疗AI最新文献

Title 题目 SpinFlowSim: A blood flow simulation framework for histology-informeddiffusion MRI microvasculature mapping in cancer SpinFlowSim:用于癌症组织学信息驱动的扩散MRI微血管映射的血流模拟框架 01 文献速递介绍 在扩散磁共振成像&#xff08…

量化面试绿皮书:21. 抛硬币游戏

文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。 21. 抛硬币游戏 两个赌徒正在玩一个抛硬币游戏。 赌徒A有(n1)枚均匀硬币,赌徒B有n枚均匀硬币。 Q: 如果两人同时抛掷所有硬币&a…

OpenLayers 框架体系

注:当前使用的是 ol 9.2.4 版本,天地图使用的key请到天地图官网申请,并替换为自己的key OpenLayers框架组织结构庞大,只通过官网API进行查看,对框架结构缺少一个整体、全面的看法。借助树形结构图或思维导图&#xff0…

缓存系统-基本概述

目录 一、系统概述 二、名词解释 三、淘汰策略 1、LRU 2、LFU 3、FIFO 4、TTL 5、Random 四、读写模式 1、Cache Aside(旁路缓存) 2、Write Through(直写) 3、Write Back(回写) 五、问题方案 …

基于GNU Radio Companion搭建的BPSK收发通信实验

目录 一、实验目的和要求 二、实验内容 1.Lab5 仿真设计一个BPSK的数字收发射系统 Lab6 实际使用RTLSDR解调BPSK信号 一、实验目的和要求 1.了解软FM的工作方式和原理,数字通信的码间串扰及星座图 2.掌握并正确使用RTL-SDL硬件和Gnuradio软件 3.正确使用Gnraduo软件,建…

华为OD机试-返回矩阵中非1的元素、个数/数值同化-BFS(JAVA 2025B卷)

import java.util.*;/*** author 308413* version Ver 1.0* date 2025/6/18* description 返回矩阵中非1的元素*/ public class Non1ElementInMatrix {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int N scanner.nextInt();int M scan…