electron的学习基础汇总

通过学习electron了解一下做项目中好奇的问题,我觉得下面这张图就可以说明一切了,就是在初次创建并显示主窗口后,一切都将建立在渲染进程和主进程的通信上,而用的技术就是ipcMain和ipcRender,那么渲染进程如何与主进程建立连接的桥梁,就涉及contextBridge,然后通过exposeInMainWorld()将API注入到window,就可全局访问。
因为已经写过截图和富文本编辑功能了,等后期再做这类的文章总结,主要目前时间不够,所以慢慢来吧。
在这里插入图片描述

标题electron工作流程

主进程:
可以看作是package.json中的main属性对应文件
一个应用只会有一个主进程
只有主进程可以进行GUI的API操作
渲染进程:
windows中展示的界面通过渲染进程表现
一个应用可以有多个渲染进程
整体流程:
启动主进程,创建窗口
加载指定界面
开启渲染进程,若渲染进程要进行通讯就需要IPC来完成进程间的操作
electron环境搭建
electron + react搭建的框架已经搭建完成来,所以省略搭建的总结文章,可以直接github上拿代码。
在这里插入图片描述

标题electron 加载app

启动app

app.whenReady().then(() => {
    // 创建window
    const mainWin = new BroBrowserWindow({})
    
    // loadFile加载指定的界面显示
    mainWin.loadFile('')
    
    mainWin.on('close|hide|move|minimize')
})
app.on('window-all-close', () => { ... })

标题electron生命周期

ready: app初始化完成
dom-ready: 一个窗口中的文本加载完成
did-finish-load:导航完成时触发
window-all-closed:所有窗口都被关闭时触发
before-quit:在关闭窗口之前触发
will-quit:在窗口关闭并且应用退出时触发
quit:当所有窗口被关闭时触发
closed:当窗口关闭时触发,此时应删除窗口引用

标题electron BrowserWindow参数修改

官网此API地址

mainWindow = new BrowserWindow({
    show: false,
    width: 1024,
    height: 728,
    // min|max -width|height来设置窗口的最大值或最小值
    minWidth: 700,
    minHeight: 570,
    // icon:作用在window窗口左上角的小logo,mac不显示,linux暂不清楚,支持png、jpg、ico格式
    icon: getAssetPath('logo.png'),
    // title:窗口标题作用在window和mac上,linux暂不清楚
    title: "横截面",
    // frame:默认为true,设置为false就是将默认的菜单栏menu隐藏,可以自定义menu
    frame: false,
    // transparent: true, // 窗口透明 默认false. 在Windows上,仅在无边框窗口下起作用。
    // // 自动隐藏菜单栏,除非按了Alt键。 默认值为 false.
    // autoHideMenuBar: true,
    webPreferences: {
      preload: app.isPackaged
        ? path.join(__dirname, 'preload.js')
        : path.join(__dirname, '../.erb/dll/preload.js'),
    },
  });
  mainWindow.loadURL(resolveHtmlPath(''));

要是在主窗口想和渲染窗口进行交互,则通过ipcMain和ipcRender来实现新窗口

ipcMain: 从主进程到渲染进程的异步通信。

ipcRender:是一个 EventEmitter 的实例。 当在主进程中使用时,它处理从渲染器进程(网页)发送出来的异步和同步信息。 从渲染器进程发送的消息将被发送到该模块。

标题electron 创建子窗口

// 引入
import { createAt } from './views/at'
createAt(mainWindow)

import { BrowserWindow } from "electron"
import { getAssetPath } from '../utils/path'

export const createAt = (main: BrowserWindow) => {
  const createAtWindow = new BrowserWindow({
    show: false,
    width: 1024,
    height: 728,
    title: '@窗口',
    minWidth: 700,
    minHeight: 570,
    icon: getAssetPath('logo.png'),
  })
  
  // 当主窗口加载好了,再显示at窗口
  main.on('ready-to-show', () => {
    if (process.env.START_MINIMIZED) {
      createAtWindow.minimize();
    } else {
      createAtWindow.show();
    }
  })
}

标题electron 阻止窗口关闭

macos系统通知设置了,但并未显示,这块儿还得进行调整

标题electron 自定义托盘样式

/**
 * 给程序增加托盘样式图标
 */
app.on('ready', () => {
  let appIcon = new Tray(path.join(__dirname, '../assets/tray.png'))
  const contextMenu = Menu.buildFromTemplate([
    { label: '退出', accelerator: 'Cmd+Q', click: () => {  app.exit() } }
  ])
  appIcon.setContextMenu(contextMenu)
})

标题electron 托盘及菜单

托盘这块儿,主要要学习的就是右击显示菜单,点击将主屏幕显示在最上面的窗口上

/** 托盘文件内容  **/
import { BrowserWindow, Menu, Tray, app, nativeImage } from "electron";
import { getAssetPath } from "../utils/path";

// 托盘小图标
const applicationImage = (path: any) =>
  nativeImage.createFromPath(path).resize({ width: 18, height: 18 });
// 获取图标路径
const trayIcon = getAssetPath('tray.png');

export const createTray = (main: BrowserWindow) => {
  /** 根据托盘所需的大小重绘 */
  let tray = new Tray(applicationImage(trayIcon))

  const menuOption = [
    { label: '退出', accelerator: 'Cmd+Q', click: () => {  app.exit() } }
  ]
  const contextMenu = Menu.buildFromTemplate(menuOption)
  /** 使用setContextMenu要慎重,因为这是设置默认行为的,要是右击,需要使用popUpContextMenu */
  // tray.setContextMenu(contextMenu);

  /**
   * 点击,显示主窗口
   */
  tray.on('click', () => {
    if(!main.isDestroyed()) main.show();
  })

  /**
   * 右击,显示菜单
   */
  tray.on('right-click', (e) => {
    tray.popUpContextMenu(contextMenu)
  })
}

标题electron的dialog

主进程
import { app, BrowserWindow, shell, ipcMain, Notification, dialog} from 'electron';
/**
 * 下载
 */
ipcMain.on(MainEnums.DOWNLOAD, () => {
  dialog.showOpenDialog({
    title: '请选择下载路径',
    defaultPath: app.getPath('downloads'),
    properties: ['openDirectory', 'createDirectory']
  }).then((res) => {
    if(res.filePaths) {
      store.set('downloadPath', res.filePaths)
    }
  })
})
/**
* 调用下载
*/
ipcRenderer.send(MainEnums.DOWNLOAD)

标题electron app dock使用

main.ts文件中的app使用dock
/**
 * Add event listeners...
 */

if(isMac) {
  const dockIcon = applicationImage({path: 'dockIcon.png'})
 
  // 获取图标路径
  app.dock.setIcon(dockIcon)
}
main.ts文件中所使用的applicationImage封装方法,我写在utils/path.ts内:
const RESOURCES_PATH = app.isPackaged
  ? path.join(process.resourcesPath, 'assets')
  : path.join(__dirname, '../../assets');

export const getAssetPath = (...paths: string[]): string => {
  return path.join(RESOURCES_PATH, ...paths);
};

// dock图标和托盘小图标共用
export const applicationImage = ({path, size}: PathType['image']) =>{
  return nativeImage.createFromPath(getAssetPath(path)).resize({ ...size })
};

electron配置打包:
参考:https://juejin.cn/post/7009179524520738824

持续更新中。。。

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

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

相关文章

X-Bogus逆向分析(纯算+补环境)

声明 本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 前言 此平台 本人 仅限…

储能逆变器测试负载箱解决方案

储能逆变器是新能源领域的重要设备,其性能的优劣直接影响到整个系统的运行效率和稳定性。因此,对储能逆变器进行严格的测试和验证是保证其性能的关键步骤。在这个过程中,负载箱是必不可少的工具,它可以模拟真实的负载条件&#xf…

JUC并发编程——对于synchronized关键字的理解

现象🔍: 两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,最后输出的 counter一定为0 吗? Slf4j(topic "c.Test17") public class Test17 {static int counter 0;public…

可望而不可即的“人文关怀”

死亡既然是最后的归宿,生命的必然,自然也就没有必要过多地害怕了。一切顺其自然,交给“命运”就是了。 我参观过英国的临终关怀医院,这是世界上最早的一所临终关怀医院,已有100多年历史。 那里的大多数病人都只剩一个…

第1章.提示词:开启AI智慧之门的钥匙

什么是提示词? 提示词,是引导语言模型的指令,让用户能够驾驭模型的输出,确保生成的文本符合需求。 ChatGPT,这位文字界的艺术大师,以transformer架构为基石,能轻松驾驭海量数据,编织…

【机器学习之---数学】马尔科夫链

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 马尔科夫 1. 概念 1.1 引言 马尔可夫链在许多领域都有应用,包括物理学、生物学、工程学、经济学和计算机科学等。在计算机科学中&#xff0…

QT使用数据库

数据库就是保存数据的文件。可以存储大量数据,包括插入数据、更新数据、截取数据等。用专业术语来说,数据库是“按照数据结构来组织、存储和管理数据的仓库”。 什么时候需要数据库?在嵌入式里,存储大量数据,或者记录数…

Kubernetes篇(二)— 集群环境搭建

目录 前言一、 环境规划集群类型安装方式主机规划 二、环境搭建主机安装环境初始化安装docker安装kubernetes组件准备集群镜像集群初始化安装网络插件 三、 服务部署 前言 本章节主要介绍如何搭建kubernetes的集群环境 一、 环境规划 集群类型 kubernetes集群大体上分为两类…

(C语言) fgetc与fputc函数详解

目录 1 fgetc函数详解 1.1 从文件流中读取数据 1.2 从标准输入流中读取数据 2 fputc函数详解 2.1 向文件流中写入数据 2.2 向标准输出流中写入数据 1 fgetc函数详解 头文件:stdio.h 该函数只有一个参数:stream 作用:从输入流中获得一个…

Gif动态图片如何制作?悄悄告诉你两招就能做!

怎么制作gif动态图片?Gif动图在我们的日常生活中非常的常见,尤其是在各大聊天软件中。当我们想要自己制作这种有趣的gif动图的时候要怎么办呢?很简单,制作gif动图的方法通常有两种,一种是视频转换gif另一种就是图片合成…

最大子序列(蓝桥杯,acwing,单调队列)

题目描述: 输入一个长度为 n 的整数序列,从中找出一段长度不超过 m 的连续子序列,使得子序列中所有数的和最大。 注意: 子序列的长度至少是 1。 输入格式: 第一行输入两个整数 n,m。 第二行输入 n 个数&#xff0…

CATSploit:一款基于CATS的自动化渗透测试执行工具

关于CATSploit CATSploit是一款基于CATS的自动化渗透测试执行工具,该工具基于网络攻击技术评分(CATS)方法实现其功能,可以在无需渗透测试人员操作的情况下,自动对目标应用执行安全渗透测试。 在执行渗透测试的过程中&…

【leetcode】力扣简单题两数之和

题目 思路 代码实现 #include<iostream> #include<unordered_map>using namespace std;class Solution { public:vector<int> TwoNumber(const vector<int>& nums, int target){vector<int> number_vector;unordered_map<int, int> …

【PyQt学习篇 · ⑮】:qrc/rcc资源系统

文章目录 qrc使用介绍rcc编译资源rcc 的安装与基本使用 编译成Python文件使用资源系统文件方式一&#xff1a;导入资源系统文件方式二&#xff1a;整合资源系统文件 qrc使用介绍 在PyQt中&#xff0c;qrc文件是一种资源文件&#xff0c;用于将应用程序所需的资源&#xff08;如…

pmp培训机构哪个比较好?国内10大热门PMP培训机构是哪些?

热门PMP培训机构推荐&#xff0c;PMP备考选择威班就是选择了高通过率 PMP热门培训机构方面我还是比较推荐威班的&#xff0c;当时选择的时候有人推荐我&#xff0c;也了解了很多&#xff0c;各种科普各种对比选择&#xff0c;最后还是选择了威班。经过体验他们的通过率比较靠谱…

Math类

java.lang.Math 提供了一系列静态方法用于科学计算&#xff0c;常用方法如下&#xff1a; abs 绝对值 acos&#xff0c;asin&#xff0c;atan&#xff0c;cos&#xff0c;sin&#xff0c;tan 三角函数 sqrt 平方根 pow(double a,double b) a的b次幂 max(double a,double b) 取大…

LiteFlow逻辑流引擎集成验证

本文将介绍开源逻辑流组件LiteFlow的架构、设计思想和适用场景&#xff0c;如何基于springboot集成LiteFlow&#xff0c;并验证DSL多种逻辑流程&#xff0c;以及逻辑流设计器的开发思路。 一、逻辑流解决什么问题 在每个公司的系统中&#xff0c;总有一些拥有复杂业务逻辑的系…

喜报 | 攸信技术再获殊荣,被授予厦门攸信智能制造系统研发中心

近日&#xff0c;厦门攸信信息技术有限公司凭借其卓越的科技创新实力和突出的研发成果&#xff0c;经过厦门市科学技术局的严格筛选与评审&#xff0c;三月份被正式授予“厦门攸信智能制造系统研发中心”的荣誉称号。 2023年12月&#xff0c;厦门市科学技术局积极响应《厦门市关…

2024年阿里云无影云电脑具体价格,99元一年起

2024年阿里云无影云电脑具体价格99元一年起&#xff0c;配置可选4核8G和8核16G&#xff0c;使用时长可选800小时和1800小时&#xff0c;目前有四款无影云电脑可以享受优惠价格&#xff0c;阿里云服务器网aliyunfuwuqi.com整理2024年无影云电脑详细配置和优惠价格表&#xff0c;…

20240322-1-协同过滤面试题

协同过滤面试题 1. 协同过滤推荐有哪些类型 基于用户(user-based)的协同过滤 基于用户(user-based)的协同过滤主要考虑的是用户和用户之间的相似度&#xff0c;只要找出相似用户喜欢的物品&#xff0c;并预测目标用户对对应物品的评分&#xff0c;就可以找到评分最高的若干个物…