第4章:Electron主窗口与子窗口管理

4.1 创建主窗口

主窗口是 Electron 应用启动后显示的第一个窗口,通常用来承载应用的主界面。我们使用 BrowserWindow 类来创建主窗口。

4.1.1 创建主窗口的基础代码

// 引入 Electron 模块和 Node.js 的 path 模块
const { app, BrowserWindow } = require('electron');
const path = require('path');

// 定义一个变量用于存储主窗口对象
let mainWindow;

// 创建主窗口的函数
const createMainWindow = () => {
  // 实例化 BrowserWindow 对象
  mainWindow = new BrowserWindow({
    width: 800, // 窗口宽度
    height: 600, // 窗口高度
    webPreferences: {
      preload: path.join(__dirname, 'preload.js'), // 指定预加载脚本
      contextIsolation: true, // 启用上下文隔离
      nodeIntegration: false // 禁用 Node.js 集成
    }
  });

  // 加载主窗口的 HTML 文件
  mainWindow.loadFile('index.html');

  // 打开开发者工具(仅在开发阶段使用)
  mainWindow.webContents.openDevTools();

  // 监听主窗口的关闭事件
  mainWindow.on('closed', () => {
    // 当窗口被关闭时,将 mainWindow 设置为 null
    mainWindow = null;
  });
};

// 当 Electron 完成初始化并准备创建浏览器窗口时,调用 createMainWindow 函数
app.on('ready', createMainWindow);

// 当所有窗口关闭时,退出应用(除非在 macOS 上)
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

// 当应用被激活时(例如在 macOS 上单击应用图标),重新创建主窗口
app.on('activate', () => {
  if (mainWindow === null) {
    createMainWindow();
  }
});

4.2 创建子窗口

子窗口用于显示辅助内容或执行辅助任务。与主窗口类似,子窗口也是通过 BrowserWindow 类创建的。

4.2.1 创建子窗口的示例代码

// 创建子窗口的函数
const createChildWindow = () => {
  // 实例化 BrowserWindow 对象
  let childWindow = new BrowserWindow({
    parent: mainWindow, // 设置父窗口为主窗口
    modal: true, // 设置为模态窗口
    width: 400, // 窗口宽度
    height: 300, // 窗口高度
    webPreferences: {
      preload: path.join(__dirname, 'preload.js'), // 指定预加载脚本
      contextIsolation: true, // 启用上下文隔离
      nodeIntegration: false // 禁用 Node.js 集成
    }
  });

  // 加载子窗口的 HTML 文件
  childWindow.loadFile('child.html');

  // 监听子窗口的关闭事件
  childWindow.on('closed', () => {
    // 当窗口被关闭时,将 childWindow 设置为 null
    childWindow = null;
  });
};

// 在主窗口创建完成后创建子窗口
app.on('ready', () => {
  createMainWindow();
  createChildWindow();
});

4.3 窗口间通信

通过 IPC 机制,主窗口和子窗口可以相互通信。这里使用 ipcMainipcRenderer 模块实现通信。

4.3.1 主窗口与子窗口之间的通信示例

主进程:

const { ipcMain } = require('electron');

// 监听从渲染进程发送的消息
ipcMain.on('message-from-child', (event, arg) => {
  console.log('Received message from child:', arg);
  // 回复消息到渲染进程
  event.reply('reply-from-main', 'Message received by main process');
});

4.4 预加载脚本

预加载脚本在渲染进程加载前执行,允许在渲染器上下文中暴露自定义 API,并提供与主进程安全通信的桥梁。

4.4.1 创建预加载脚本

preload.js

const { contextBridge, ipcRenderer } = require('electron');

// 使用 contextBridge 将安全的 API 暴露给渲染进程
contextBridge.exposeInMainWorld('electronAPI', {
  sendMessage: (message) => ipcRenderer.send('message-from-child', message),
  onReply: (callback) => ipcRenderer.on('reply-from-main', (event, args) => callback(args))
});

4.4.2 在渲染进程中使用预加载脚本

子窗口(渲染进程):

<!DOCTYPE html>
<html>
  <head>
    <title>Child Window</title>
  </head>
  <body>
    <h1>Child Window</h1>
    <button id="sendMessageBtn">Send Message to Main</button>
    <script>
      // 使用预加载脚本暴露的 API
      document.getElementById('sendMessageBtn').addEventListener('click', () => {
        window.electronAPI.sendMessage('Hello from child window');
      });

      window.electronAPI.onReply((message) => {
        console.log('Received reply from main:', message);
      });
    </script>
  </body>
</html>

4.5 管理多个窗口

在复杂的应用中,可能需要同时管理多个窗口。可以通过存储窗口实例的数组或对象来实现这一点。

4.5.1 管理多个窗口的示例

const windows = {};

// 创建子窗口的函数
const createChildWindow = (windowName) => {
  let childWindow = new BrowserWindow({
    parent: mainWindow,
    modal: true,
    width: 400,
    height: 300,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js'),
      contextIsolation: true,
      nodeIntegration: false
    }
  });

  childWindow.loadFile('child.html');

  childWindow.on('closed', () => {
    // 当窗口被关闭时,从 windows 对象中删除对应的实例
    delete windows[windowName];
  });

  // 将窗口实例存储到 windows 对象中
  windows[windowName] = childWindow;
};

// 创建多个子窗口
app.on('ready', () => {
  createMainWindow();
  createChildWindow('child1');
  createChildWindow('child2');
});

4.6 窗口的显示和隐藏

有时需要在应用中显示或隐藏窗口,而不是创建或销毁它们。

4.6.1 显示和隐藏窗口的示例

// 显示子窗口
const showChildWindow = (windowName) => {
  if (windows[windowName]) {
    windows[windowName].show();
  }
};

// 隐藏子窗口
const hideChildWindow = (windowName) => {
  if (windows[windowName]) {
    windows[windowName].hide();
  }
};

// 在主窗口创建完成后创建子窗口并演示显示和隐藏功能
app.on('ready', () => {
  createMainWindow();
  createChildWindow('child1');

  // 隐藏子窗口 child1
  hideChildWindow('child1');

  // 2 秒后显示子窗口 child1
  setTimeout(() => {
    showChildWindow('child1');
  }, 2000);
});

通过本章内容,你已经了解了如何在 Electron 中创建和管理主窗口及子窗口,包括如何进行窗口间通信、使用预加载脚本提高安全性、管理多个窗口以及显示和隐藏窗口的操作。在接下来的章节中,我们将进一步探讨如何实现更多高级功能和最佳实践,帮助你进一步掌握 Electron 开发。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenSSH RCE (CVE-2024-6387) | 附poc | 小试

Ⅰ 漏洞描述 OpenSSH 远程代码执行漏洞(CVE-2024-6387)&#xff0c;该漏洞是由于OpenSSH服务器 (sshd) 中的信号处理程序竞争问题&#xff0c;未经身份验证的攻击者可以利用此漏洞在Linux系统上以root身份执行任意代码。 Ⅱ 影响范围 8.5p1 < OpenSSH < 9.8p1 但OpenSS…

ghost恢复?电脑文件恢复如何操作?电脑数据恢复工具!5款!

在数字化时代&#xff0c;电脑数据的价值日益凸显。然而&#xff0c;数据丢失、误删、系统崩溃等问题时有发生&#xff0c;给个人和企业带来巨大损失。本文将为您详细介绍Ghost恢复方法&#xff0c;同时推荐五款高效的电脑数据恢复工具&#xff0c;助您轻松应对数据丢失的困扰。…

DreamTech联合南大和牛津发布最强3D内容生成大模型——Direct3D

文章链接&#xff1a;https://arxiv.org/pdf/2405.14832 github链接&#xff1a;https://nju-3dv.github.io/projects/Direct3D/ 从文本和图像生成高质量的3D资产一直是一项挑战&#xff0c;主要是由于缺乏能够捕捉复杂几何分布的可扩展3D表示。在这项工作中&#xff0c;介绍…

7.x86游戏实战-C++实现跨进程读写-跨进程写内存

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;6.x86游戏实战-C实现跨进程读写-通过基址读取人物状态标志位 上一个内容通过基…

试用笔记之-汇通周易(易经)字典软件

首先下载汇通周易字典软件 汇通周易(易经)字典软件 http://www.htsoft.com.cn/download/htzhouyi.rar 解压安装后&#xff0c;桌面图标 双击这个汇通周易字典图标

【AHK V2】 定时刷新窗口中的控件内容

在AutoHotkey v2 中设计GUI窗口,窗口中有个文本框,可以定时刷新内容。 时间周期可以通过窗口中的 下拉框来设定。 /************************************************************************* @description * @file 控件自动更新.ahk* @author sunwind1576157* @date 2024…

【信息系统项目管理师】18年~23年案例概念型知识

文章目录 18上18下19上19下20上20下21上21下22年上22年下23年上 18上 请简述 ISO 9000 质量管理的原则 领导作用、 过程方法、 管理的系统方法、 与供方互利的关系、 基于事实的决策方法、 持续改进、 全员参与、 以顾客为关注焦点 概念 国家标准(GB/T 1 9000 2008)对质量的定…

如何在Python中实现一个简单的爬虫程序

如何在Python中实现一个简单的爬虫程序 随着互联网的发展&#xff0c;数据已成为当今社会最宝贵的资源之一。而爬虫程序则成为了获取互联网数据的重要工具之一。本文将介绍如何在Python中实现一个简单的爬虫程序&#xff0c;并提供具体的代码示例。 确定目标网站 在开始编写爬…

数组-移除元素

移除元素 移除元素&#xff08;leetcode27&#xff09; var removeElement function(nums, val) {const n nums.length;let left 0;for (let right 0; right < n; right) {if (nums[right] ! val) {nums[left] nums[right];left;}}return left; };删除有序数组中的重复…

236、二叉树的最近公共祖先

前提&#xff1a; 所有 Node.val 互不相同 。p ! qp 和 q 均存在于给定的二叉树中。 代码如下&#xff1a; class Solution { public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if (root q || root p || root NULL) return root;TreeN…

代码随想录第41天|动态规划

322. 零钱兑换 dp[j] : 最小硬币数量, j 为金额(相当于背包空间)递推公式 : dp[j] min(dp[j - coins[i]] 1, dp[j])初始化: 需要一个最大值, 避免覆盖, dp[0] 0遍历顺序: 钱币有序无序不影响, 因为求解最小个数, 结果相同(先遍历物品后背包, 先背包后物品都可) class Solut…

构造,析构,拷贝【类和对象(中)】

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;LiUEEEEE                        …

Mysql和ES使用汇总

一、mysql和ES在业务上的配合使用 一般使用时使用ES 中存储全文检索的关键字与获取的商品详情的id&#xff0c;通过ES查询获取查询商品的列表中展示的数据&#xff0c;通过展示id 操作去获取展示商品的所有信息。mysql根据id去查询数据库数据是很快的&#xff1b; 为什么ES一般…

Linux高并发服务器开发(九)Tcp状态转移和IO多路复用

文章目录 0 包裹函数1 多进程服务器流程代码 2 多线程服务器3 TCP状态转移半关闭心跳包 4 端口复用5 IO多路复用技术高并发服务器 6 select代码总结 7 POLLAPI代码poll相对select的优缺点 8 epoll&#xff08;重点&#xff09;API监听管道代码EPOLL 高并发服务器 9 Epoll的两种…

真的假不了,假的真不了

大家好&#xff0c;我是瑶琴呀&#xff0c;拥有一头黑长直秀发的女程序员。 最近&#xff0c;17岁的中专生姜萍参加阿里巴巴 2024 年的全球数学竞赛&#xff0c;取得了 12 名的好成绩&#xff0c;一时间在网上沸腾不止。 从最开始的“数学天才”&#xff0c;到被质疑&#xff…

YOLO-V2

一、V2版本细节升级 1、YOLO-V2&#xff1a; 更快&#xff01;更强 1.1 做的改进内容 1. YOLO-V2-Batch Normalization V2版本舍弃Dropout&#xff0c;卷积后每一层全部加入Batch Normalization网络的每一层的输入都做了归一化&#xff0c;收敛相对更容易经过Batch Norma…

【动态规划 前缀和】2478. 完美分割的方案数

本文涉及知识点 划分型dp 动态规划汇总 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode 2478. 完美分割的方案数 给你一个字符串 s &#xff0c;每个字符是数字 ‘1’ 到 ‘9’ &#xff0c;再给你两个整数 k 和 minLength 。 如…

A股站不稳3000点让人稀罕不已啊

今天的A股&#xff0c;让人稀罕不已&#xff0c;你知道是为什么吗&#xff1f;盘面出现2个重要信号&#xff0c;一起来看看&#xff1a; 1、今天两市冲了下3000点&#xff0c;第一个主题炒作的热点终于出现了&#xff0c;税改方向的行情发酵&#xff0c;并带动着其他改革相关方…

某某市信息科技学业水平测试软件打开加载失败逆向分析(笔记)

引言&#xff1a;笔者在工作过程中&#xff0c;用户上报某某市信息科技学业水平测试软件在云电脑上打开初始化的情况下出现了加载和绑定机器失败的问题。一般情况下&#xff0c;在实体机上用户进行登录后&#xff0c;用户的账号信息跟主机的机器码进行绑定然后保存到配置文件&a…

时间复利效应才是人生的催化剂

在追求成功的道路上&#xff0c;许多人都在寻找捷径。然而&#xff0c;真正的捷径并非不劳而获的幻想&#xff0c;而是通过长期坚持在某一领域深耕细作&#xff0c;享受时间复利效应带来的巨大收益。本文将探讨如何选择合适的领域并长期坚持下去&#xff0c;以实现成功。 时间…
最新文章