当前位置: 首页 > news >正文

Electron之单例+多窗口

Electron之单例+多窗口

Electron 24 + React 18

单例可以通过app.requestSingleInstanceLock实现,多窗口可以简单通过路由来实现

单例

const gotTheLock = app.requestSingleInstanceLock();
if (!gotTheLock) {app.quit();
} else {app.on('second-instance', (event, commandLine, workingDirectory) => {const args = commandLine;const route = args.length > 2 ? args[2] : '';const preWnd = BrowserWindow.getAllWindows().find((e) => e.title === route);if (!preWnd) {createWindow(route);} else {const wnd = BrowserWindow.fromId(preWnd.id);if (wnd) {if (wnd.isMinimized()) {wnd.restore();};wnd.focus();}}});app.whenReady().then(() => {electronApp.setAppUserModelId('electron');app.on('browser-window-created', (_, window) => {optimizer.watchWindowShortcuts(window);});const args = process.argv.splice(app.isPackaged ? 1 : 2);let route = args.length > 0 ? args[0] : 'home';createWindow(route);app.on('activate', function () {if (BrowserWindow.getAllWindows().length === 0) createWindow();});});}
  • whenReady时创建初始化窗口
  • second-instance时处理重复打开操作

多窗口

const createWindow = (route: string = 'home') => {const windowConfig = getWindowConfig(route);const window = new BrowserWindow({title: windowConfig.title,width: windowConfig.width,height: windowConfig.height,show: false,frame: false,autoHideMenuBar: true,...(process.platform === 'linux' ? { icon } : {}),webPreferences: {preload: join(__dirname, '../preload/index.js'),sandbox: false,devTools: !app.isPackaged,nodeIntegration: true,contextIsolation: false,partition: `persist:${new Date().getTime()}`}});window.on('ready-to-show', () => {window.show();});window.webContents.setWindowOpenHandler((details) => {shell.openExternal(details.url);return { action: 'deny' };});if (is.dev && process.env['ELECTRON_RENDERER_URL']) {window.loadURL(`${process.env['ELECTRON_RENDERER_URL']}/index.html#/${route}`);} else {window.loadFile(join(__dirname, `../renderer/index.html`), { hash: `/${route}` });}return window;
};
    <HashRouter><Routes><Route path="/" element={<Home />} /><Route path="/home" element={<Home />} /><Route path="/page1" element={<Page1 />} /></Routes></HashRouter>
  • 通过唯一title区分窗口,动态创建新窗口或恢复旧窗口
  • 这里前端部分使用react 18 + react-router-dom 6,注意要使用HashRouter
http://www.lryc.cn/news/157701.html

相关文章:

  • A Survey of Knowledge-Enhanced Pre-trained Language Models
  • 动态规划(选择)
  • IIS WebDAV配置,https绑定及asp设置
  • 【计算机视觉项目实战】中文场景识别
  • Java 中 Map 初始化的几种方法
  • 【学习方法论】学习的三种境界、三种习惯、三个要点,三个心态
  • [管理与领导-67]:IT基层管理者 - 辅助技能 - 4- 职业发展规划 - 评估你与公司的八字是否相合
  • 【PMO项目管理】深入了解项目管理 | Stakeholder 利益相关者 | 利益相关者之间的立场差异
  • 设计模式-原则篇-01.开闭原则
  • JAVA毕业设计096—基于Java+Springboot+Vue的在线教育系统(源码+数据库+18000字论文)
  • windows环境搭建ELK
  • langchain介绍之-Prompt
  • 汇编语言Nasmide编辑软件
  • 用python开发一个炸金花小游戏
  • Uniapp中使用uQRCode二维码跳转小程序页面
  • 解决husky在mac下不生效的问题
  • 如何在自动化测试中使用MitmProxy获取数据返回?
  • 达之云BI平台助力中国融通集团陕西军民服务社有限公司实现数字化运营
  • Private market:借助ZK实现的任意计算的trustless交易
  • 反序列化漏洞复现(typecho)
  • QT设计一个小闹钟
  • MybatisPlus(3)
  • 安全计算环境技术测评要求项
  • Excel快捷键表
  • Windows Server 系统各版本及授权说明(附下载地址
  • 【智慧工地源码】物联网和传感器技术在智慧工地的应用
  • 计算机安全学习笔记(IV):基于角色的访问控制 - RBAC
  • MFC中的Button修改颜色的方法
  • 【算法】选择排序
  • golang之context实用记录