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
英文地址,請注明出處:http://en.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…