Electron的学习

目录

      • 项目初始化可以看官网非常详细
      • 根路径创建.vscode文件夹
      • 主进程和渲染进程之前的通信
        • `ipcRenderer.send`和`ipcMain.on`的使用
        • `ipcRenderer.invoke`和`ipcMain.handle`的使用
      • 切换主题模式
      • 文件拖放保存
      • 消息通知
      • 进度展示
      • 图标闪烁
      • 自定义菜单
      • 自定义右键菜单

项目初始化可以看官网非常详细

快速入门
主要需要看下窗口的配置

  const win = new BrowserWindow({width: 800,height: 600,center: true,// frame: false, //创建无边框窗口// titleBarStyle: "hidden", //隐藏默认的标题栏// 隐藏菜单// autoHideMenuBar: true,webPreferences: {preload: path.join(__dirname, "preload.js"),webviewTag: true, //允许使用<webview>标签// offscreen: true, //离屏渲染},});

根路径创建.vscode文件夹

创建launch.json文件,用来调试
在这里插入图片描述

{"version": "0.2.0","compounds": [{"name": "Main + renderer","configurations": ["Main", "Renderer"],"stopAll": true}],"configurations": [{"name": "Renderer","port": 9222,"request": "attach","type": "chrome","webRoot": "${workspaceFolder}"},{"name": "Main","type": "node","request": "launch","cwd": "${workspaceFolder}","runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron","windows": {"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd"},"args": [".", "--remote-debugging-port=9222"],"outputCapture": "std","console": "integratedTerminal"}]
}

主进程和渲染进程之前的通信

ipcRenderer.sendipcMain.on的使用
  1. preload.js中引入contextBridge, ipcRenderer进行消息注册
const { contextBridge, ipcRenderer } = require("electron");contextBridge.exposeInMainWorld("myAPI", {setTitle: (title) => {ipcRenderer.send("set-title", title);},
});
  1. main.js中进行消息处理
app.on("ready", () => {// 设置标题ipcMain.on("set-title", handleSetTitle);createWindow();
});/*** @description 设置title*/
function handleSetTitle(event, title) {const webContents = event.sender;const win = BrowserWindow.fromWebContents(webContents);win.setTitle(title);
}
  1. renderer.js中触发事件,修改title
<h1>ipcRenderer.send-ipcMain.on的使用</h1><input id="title"></input>
<button id="set-title">修改title</button>
/*** @description 修改窗口title*/
const titleEl = document.getElementById("title");
const handleTitleBtn = document.getElementById("set-title");
handleTitleBtn.addEventListener("click", () => {window.myAPI.setTitle(titleEl.value);
});

在这里插入图片描述

ipcRenderer.invokeipcMain.handle的使用

和send-on的区别主要在于可以双向通信

  1. preload.js
const { contextBridge, ipcRenderer } = require("electron");contextBridge.exposeInMainWorld("myAPI", {openFile: () => ipcRenderer.invoke("dialog:openFile"),
});
  1. main.js
app.on("ready", () => {// 获取文件ipcMain.handle("dialog:openFile", handleOpenFile);createWindow();
});/*** @description 打开文件选择弹窗*/
async function handleOpenFile() {const { canceled, filePaths } = await dialog.showOpenDialog({});if (!canceled) {return filePaths[0];//返回值给invoke}
}
  1. renderer.js
    <button type="button" id="file-btn">Open a File</button>File path: <strong id="file-path"></strong>
/*** @description 打开文件*/
const handleFileBtn = document.getElementById("file-btn");
const filePath = document.getElementById("file-path");
handleFileBtn.addEventListener("click", async () => {const path = await window.myAPI.openFile();filePath.innerHTML = path;
});

在这里插入图片描述

切换主题模式

const {dialog,nativeTheme,globalShortcut,nativeImage,
} = require("electron");app.on("ready", () => {// 设置主题ipcMain.handle("trigger-mode", triggerMode);createWindow();
});/*** @description 设置主题*/
function triggerMode() {if (nativeTheme.shouldUseDarkColors) {nativeTheme.themeSource = "light";} else {nativeTheme.themeSource = "dark";}return nativeTheme.shouldUseDarkColors;
}

在这里插入图片描述

文件拖放保存

  1. 注册事件
contextBridge.exposeInMainWorld("myAPI", {startDrag: (fileName) => ipcRenderer.send("ondragstart", fileName),
});
  1. 处理事件
app.on("ready", () => {// 文件的拖放保存ipcMain.on("ondragstart", fileDrag);createWindow();
});/*** @description 原生文件拖放*/
function fileDrag(event, filePath) {// 文件拖放const iconName = path.join(__dirname, "doc.png"); //iconevent.sender.startDrag({file: path.join(__dirname, filePath),icon: iconName,});
}
  1. 给元素添加拖拽事件
/*** @description 原生文件的拖拽*/
document.getElementById("drag").ondragstart = (event) => {event.preventDefault();window.myAPI.startDrag("test.txt");
};
  1. 根路径准备一个test.txt文件
    在这里插入图片描述

消息通知

//main.js
app.on("ready", () => {createWindow();ipcMain.on("open-message", openMessage);
});/*** @description 打开消息*/
function openMessage(event, message) {const notice = new Notification({title: "消息",body: message,});notice.show();notice.on("click", () => {console.log("点击了通知");});
}

在这里插入图片描述

进度展示

//main.js
app.on("ready", () => {// 设置进度条ipcMain.handle("progress", setProgress);createWindow();
});/*** @description 设置进度条*/
function setProgress(event, num) {const webContents = event.sender;const win = BrowserWindow.fromWebContents(webContents);if (num >= 1) {win.setProgressBar(-1); //-1完成return true;} else {win.setProgressBar(num);//num:0-1return false;}
}

在这里插入图片描述
在这里插入图片描述

图标闪烁

//main.js
app.on("ready", () => {// 闪烁ipcMain.on("flash", setFlash);createWindow();
});/*** @description 设置闪烁*/
function setFlash(event) {const webContents = event.sender;const win = BrowserWindow.fromWebContents(webContents);win.flashFrame(true);
}

在这里插入图片描述

自定义菜单

/*** @description 添加菜单*/
function addMenu() {const menu = new Menu();const submenu = new Menu();menu.append(new MenuItem({ label: "测试", submenu }));Menu.setApplicationMenu(menu);submenu.append(new MenuItem({ label: "测试1" }));
}

在这里插入图片描述

自定义右键菜单

  1. 监听右键菜单
//renderer.js/*** @description 监听右键菜单*/window.addEventListener("contextmenu", async (e) => {e.preventDefault();const menu = [{label: "Run Code",click: true,},{label: "转到定义",click: true,},{type: "separator",},{label: "复制",click: true,},];const clickOne = await window.myAPI.addContextMenu(menu);console.log(clickOne);});
  1. 添加菜单
//main.js
/*** @description 添加右键菜单*/
function addContextMenu(event, contextMenu) {return new Promise((resolve) => {const menuReal = contextMenu.map((item) => {if (item.click) {return {...item,click: () => {resolve(item.label);},};} else {return item;}});const menu = Menu.buildFromTemplate(menuReal);menu.popup({window: BrowserWindow.fromWebContents(event.sender),});});
}

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

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

相关文章

基于PSO优化的CNN-LSTM-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1卷积神经网络&#xff08;CNN&#xff09;在时间序列中的应用 4.2 长短时记忆网络&#xff08;LSTM&#xff09;处理序列依赖关系 4.3 注意力机制&#xff08;Attention&#xff09; 5…

如何将平板或手机作为电脑的外接显示器?

先上官网链接&#xff1a;ExtensoDesk 家里有一台华为平板&#xff0c;自从买回来以后除了看视频外&#xff0c;基本没什么作用&#xff0c;于是想着将其作为我电脑的第二个屏幕&#xff0c;提高我学习办公的效率&#xff0c;废物再次利用。最近了解到华为和小米生态有多屏协同…

FMEA引领智能家居安全革新,打造无忧智能生活新纪元!

在智能家居日益普及的今天&#xff0c;如何确保家居安全成为消费者关注的焦点。本文将探讨如何通过FMEA&#xff08;故障模式与影响分析&#xff09;这一强大的质量管理工具&#xff0c;为智能家居赋能&#xff0c;打造安全无忧的智能生活新体验。 一、FMEA在智能家居领域的应用…

wireshark数据流分析-学习日记day1

参考内容&#xff1a; 网址hxxp://194.55.224[.]9/liuz/5/fre.php描述Loki Bot C2 网址早在 2023-08-15 就被注意到了2023-07-27 记录的 IcedID C2 域&#xff1a; vrondafarih[.]com - HTTP trafficmagiketchinn[.]com - HTTPS trafficmagizanqomo[.]com - HTTPS traffic 网…

【Python从入门到进阶】52、CrawlSpider链接提取器的使用

接上篇《51、电影天堂网站多页面下载实战》 上一篇我们采用Scrapy框架多页面下载的模式来实现电影天堂网站的电影标题及图片抓取。本篇我们来学习基于规则进行跟踪和自动爬取网页数据的“特殊爬虫”CrawlSpider。 一、什么是CrawlSpider&#xff1f; 1、CrawlSpider的概念 Cr…

算法打卡day23

今日任务&#xff1a; 1&#xff09;39. 组合总和 2&#xff09;40.组合总和II 3&#xff09;131.分割回文串 39. 组合总和 题目链接&#xff1a;39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;…

(十)Docker的基本操作

1.1.镜像操作 1.1.1.镜像名称 首先来看下镜像的名称组成&#xff1a; 镜名称一般分两部分组成&#xff1a;[repository]:[tag]。在没有指定tag时&#xff0c;默认是latest&#xff0c;代表最新版本的镜像 如图&#xff1a; 这里的mysql就是repository&#xff0c;5.7就是…

Python学习: 错误和异常

Python 语法错误 解析错误&#xff08;Parsing Error&#xff09;通常指的是程序无法正确地解析&#xff08;识别、分析&#xff09;所给定的代码&#xff0c;通常是由于代码中存在语法错误或者其他无法理解的结构导致的。这可能是由于缺少括号、缩进错误、未关闭的引号或其他括…

数据结构——二叉树——二叉搜索树(Binary Search Tree, BST)

目录 一、98. 验证二叉搜索树 二、96. 不同的二叉搜索树 三、538. 把二叉搜索树转换为累加树 二叉搜索树&#xff1a;对于二叉搜索树中的每个结点&#xff0c;其左子结点的值小于该结点的值&#xff0c;而右子结点的值大于该结点的值 一、98. 验证二叉搜索树 给你一个二叉树的…

P6维护:Oracle P6服务性能优化

前言 本文将介绍如何对ORACLE Primavera P6 EPPM软件进行性能调优&#xff0c;考虑到P6主要采用JAVA语言编制&#xff0c;且其使用的是Weblogic Server应用服务器部署P6各项服务器&#xff0c;其性能优化的原理便是基于其JVM特征参数进行设置 方法一&#xff1a;修改配置文件…

Maplesoft Maple 2024(数学科学计算)mac/win

Maplesoft Maple是一款强大的数学计算软件&#xff0c;提供了丰富的功能和工具&#xff0c;用于数学建模、符号计算、数据可视化等领域的数学分析和解决方案。 Mac版软件下载&#xff1a;Maplesoft Maple 2024 for mac激活版 WIn版软件下载&#xff1a;Maplesoft Maple 2024特别…

银行业架构网络BIAN (Banking IndustryArchitecture Network)详细介绍

BIAN ( The Banking Industry Architecture Network) 是一个业界多方协作的非营利性组织&#xff0c;由全球领先银行、技术提供商、顾问和学者组成&#xff0c;定义了一个用以简化和标准化核心银行体系结构的银行技术框架。这一框架基于面向服务的架构 (SOA) 原则&#xff0c;银…

Docker工作流

1.工作流 开发应用编写Dockerfile构建Docker镜像运行Docker容器测试应用发布镜像到Hub迭代更新镜像 2.开发应用 首先你需要创建一个应用&#xff0c;这个应用可以是后端应用或者前端应用&#xff0c;任何语言都可以。 比如&#xff1a;我使用IDEA 创建一个Java后端应用&…

Vue项目中引入html页面(vue.js中引入echarts数据大屏html [静态非数据传递!] )

在项目原有vue&#xff08;例如首页&#xff09;基础上引入html页面 1、存放位置 vue3原有public文件夹下 我这边是新建一个static文件夹 专门存放要用到的html文件 复制拖拽过来 index为html的首页 2、更改路径引入到vue中 这里用到的是 iframe 方法 不同于vue的 component…

权限认证SpringCloud GateWay、SpringSecurity、OAuth2.0、JWT一网打尽!

权限认证SpringCloud GateWay、SpringSecurity、OAuth2.0、JWT一网打尽 一、SpringCloud GateWay 1.它是如何工作的&#xff1f; ​ 客户端向 Spring Cloud Gateway 发出请求。如果Gateway处理程序映射确定一个请求与路由相匹配&#xff0c;它将被发送到Gateway Web处理程序。…

【Go】七、包、init函数、匿名函数、闭包

文章目录 1、包2、本质3、init函数4、匿名函数5、闭包 1、包 不同的包&#xff0c;不同的功能和业务&#xff0c;互相import 关于包&#xff1a; package 包名注意点&#xff1a; 建议包名和所在文件夹同名 main函数一定要放在main包下&#xff0c;否则编译报错 go run&a…

IP归属地在互联网行业中的应用

摘要&#xff1a;IP&#xff08;Internet Protocol&#xff09;地址归属地是指互联网上某个IP地址所对应的地理位置信息。在互联网行业中&#xff0c;IP归属地具有重要的应用价值&#xff0c;包括网络安全、广告定向、用户定位等方面。IP数据云将探讨IP归属地在互联网行业中的应…

3d怎么两个模型连接圆润?---模大狮模型网

在3D建模中&#xff0c;如何实现两个3d模型的圆润连接是一个常见而又关键的问题。无论是为了美观的外观设计还是为了模型的功能性&#xff0c;圆润连接都能够增加模型的整体质感和流畅度。模大狮将介绍一些常见的方法和技巧&#xff0c;帮助您实现两个模型之间的圆润连接。 一、…

Linux如何连接github仓库

一.创建一个github账号 如何创建一个github账号 二.在github上创建一个仓库 登录上github后出现这个界面 然后点击左上角头像&#xff0c;在按照图片位置点击&#xff1a; 继续按照图片上的位置进行点击&#xff1a; 创建成功&#xff1a; 三.云主机连接Github仓库 1.在linux中…

深度学习-计算机视觉入门-part1

计算机视觉入门 文章目录 计算机视觉入门一、 从卷积到卷积神经网络1.图像的基本表示2. 卷积操作3.卷积遇见深度学习3.1 通过学习寻找卷积核3.2 参数共享&#xff1a;卷积带来参数量骤减3.3 稀疏交互&#xff1a;获取更深入的特征 二、手撕卷积代码三、经典CNN模型介绍四、CNN模…