electron学习和新建窗口

news2024/12/24 19:41:36

首先我们要先下载electron

npm install --save-dev electron

建立入口文件main.js

 新建一个入口文件 main.js,然后导入eletron新建一个窗口。

const { app, BrowserWindow, ipcMain } = require("electron");
const path = require("path");

function createWindow() {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    show: false,
    // minHeight:600,
    // minWidth:800,
    autoHideMenuBar: true, // 菜单栏
  });
  // 这里引入页面  如果说url 需要win.loadUrl()引入
  win.loadFile("./index.html");

  win.webContents.openDevTools();

  win.on(
    "activate",
    () => BrowserWindow.getAllWindows().length === 0 && createWindow()
  );
  // 解决内容空白加载问题
  win.on("ready-to-show", () => {
    win.show();
  });

  //一个窗口中的文本加载完成
  win.webContents.on("dom-ready", () => {
    console.log("2、一个窗口中的文本加载完成");
  });

  //一个窗口中的文本加载完成
  win.webContents.on("close", () => {
    console.log("8、关闭窗口");
  });

  
}

app.whenReady().then(() => {
  createWindow();

  app.on("activate", () => {
    if (BrowserWindow.getAllWindows().length === 0) {
      createWindow();
    }
  });
});

// 生命周期

// app初始化完成
app.on("ready", () => {});

// 一个窗口中的文本加载完成
app.on("dom-ready", () => {});

// 所有窗口都被关闭时触发
app.on("window-all-closed", () => {
  app.quit();
});

建立一个页面

新建一个html,然后通过main.js里的 win.loadFile引入 就ok了 

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
    你能看见我吗
</body>
</html>

添加命令 启动

最后在在package.json里添加启动命令 start

 "scripts": {
    "dev": "nodemon --watch main.js --exec npm run build",
    "start": "electron ."
  },

然后启动就ok了

添加新窗口

方式一:

在页面直接 window.opne()

方式二: 

我们需要页面和electron配置相关了,我们这里使用electron提供的 ipcMain、ipcRenderer, 可以使electron主进程和渲染层通讯。

编辑预加载 preload.js

preload.js主要是联通electron主进程和渲染端的桥梁,我们新建js文件夹,用contextBridge.exposeInMainWorld把方法暴露在window上,不直接把ipcRenderer暴露在window上的原因是因为怕网络攻击。

这里是吧 IPC绑定在window上

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

const fs = require("fs");

/**
 * 通信方法挂载到window对象上
 * 在渲染进程中使用:
 * <script setup lang="ts">
 * window.IPC.createWin()
 * </script>
 */
contextBridge.exposeInMainWorld("IPC", {
  closeWindow: () => {
    ipcRenderer.invoke("closeWindow");
  },
  minimizeWindow: () => {
    ipcRenderer.invoke("minimizeWindow");
  },
  createWin: (data) => {
    console.log(data);
    ipcRenderer.invoke("create");
  },
});
绑定preload.js

在main.js绑定preload.js,同时接收 ipcRenderer方法

 const win = new BrowserWindow({
    width: 800,
    height: 600,
    show: false,
    // minHeight:600,
    // minWidth:800,
    autoHideMenuBar: true, // 菜单栏
    webPreferences: {
      preload: path.join(__dirname, "preload.js"),
      nodeIntegration: true, // 可以在页面引用的js里面使用node。js语法 如 require
      enableRemoteModule: true, // 可以在页面引用 electron 中的 remote
    },
  });

在main.js用ipcMain.handle()接收方法,并打开一个新的窗口,新的窗口要新建一个页面html 

const { app, BrowserWindow, ipcMain } = require("electron");
// 信息传递 ipcMain要引入
  ipcMain.handle("create", (event, args) => {
    console.log("可以看见我吗");
    let win = new BrowserWindow({
      width: 400, // * 指定启动app时的默认窗口尺寸
      height: 400, // * 指定启动app时的默认窗口尺
      resizable: true, // 禁止手动修改窗口尺寸
      autoHideMenuBar: true,
      icon: path.join(__dirname, "favicon.ico"),
    });

    //   win.loadURL("./dong.html");
    win.loadFile(path.join(__dirname, "dong.html"));
    win.on("close", () => {
      console.log("关闭窗口");
    });
  });

main.js全部代码

const { app, BrowserWindow, ipcMain } = require("electron");
const path = require("path");

function createWindow() {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    show: false,
    // minHeight:600,
    // minWidth:800,
    autoHideMenuBar: true, // 菜单栏
    webPreferences: {
      preload: path.join(__dirname, "preload.js"),
      nodeIntegration: true, // 可以在页面引用的js里面使用node。js语法 如 require
      enableRemoteModule: true, // 可以在页面引用 electron 中的 remote
    },
  });

  win.loadFile("./index.html");

  win.webContents.openDevTools();

  win.on(
    "activate",
    () => BrowserWindow.getAllWindows().length === 0 && createWindow()
  );
  // 解决内容空白加载问题
  win.on("ready-to-show", () => {
    win.show();
  });

  //一个窗口中的文本加载完成
  win.webContents.on("dom-ready", () => {
    console.log("2、一个窗口中的文本加载完成");
  });

  //一个窗口中的文本加载完成
  win.webContents.on("close", () => {
    console.log("8、关闭窗口");
  });

  // 信息传递
  ipcMain.handle("create", (event, args) => {
    console.log("可以看见我吗");
    let win = new BrowserWindow({
      width: 400, // * 指定启动app时的默认窗口尺寸
      height: 400, // * 指定启动app时的默认窗口尺
      resizable: true, // 禁止手动修改窗口尺寸
      autoHideMenuBar: true,
      icon: path.join(__dirname, "favicon.ico"),
    });

    //   win.loadURL("./dong.html");
    win.loadFile(path.join(__dirname, "dong.html"));
    win.on("close", () => {
      console.log("关闭窗口");
    });
  });
}

app.whenReady().then(() => {
  createWindow();

  app.on("activate", () => {
    if (BrowserWindow.getAllWindows().length === 0) {
      createWindow();
    }
  });
});

// 生命周期

// app初始化完成
app.on("ready", () => {});

// 一个窗口中的文本加载完成
app.on("dom-ready", () => {});

// 所有窗口都被关闭时触发
app.on("window-all-closed", () => {
  app.quit();
});
页面点击创建弹窗

页面中用window.IPC去掉preload.js里的方法

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
    你能看见我吗
  
</body>
<script>
  const btn1 = document.getElementById("btn1")
  btn1.onclick = function(){
    window.IPC.createWin(123)
  }
</script>
</html>
 目录

启动成功

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

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

相关文章

MacBook的nginx出现13: Permission denied 的问题分析和解决办法

同样的项目代码&#xff0c;电脑从Windows更换到了MacBook&#xff0c;发现网站的样式都没有了&#xff0c;直接访问CSS文件 http://crm.ms-test.cc/toolstatic/css/bootstrap.min.css 发现无法访问。查看Nginx错误日志&#xff1a; 说明是nginx没有权限访问这个CSS文件&#…

HTTP 与 HTTPS-HTTP 解决了 HTTP 哪些问题?

资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) HTTP 解决了 HTTP 哪些问题? HTTP 由于是明文传输&#xff0c;所以安全上存在以下三个风险: 窃听风险&#xff0c;比如通信链路上可以获取通信内容&#xff0c;用户号容易没。篡改风险&#xff0c;比如…

防御保护---VPN

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.VPN概述 VPN的基本原理是在原有的公共网络之上&#xff0c;建立一个使用加密技术保护数据传输的私有网络。通过VPN&#xff0c;用户可以在不同的地点之间建立起安全的连接&#xff0c;实现远…

【Crypto | CTF】BUUCTF RSA2

天命&#xff1a;密码学越来越难了&#xff0c;看别人笔记都不知道写啥 天命&#xff1a;莫慌&#xff0c;虽然我不会推演法&#xff0c;但我可以用归纳法 虽然我不知道解题的推演&#xff0c;但我可以背公式啊哈哈哈 虽然我不会这题&#xff0c;但是我也能做出来 公式我不知…

笔试题讲解(C语言进阶)

目录 前言 1、题目 2、答案 3、解析 结语 前言 “纸上得来终觉浅&#xff0c;绝知此事要躬行”。本篇通过对指针实际案例的分析&#xff0c;由浅入深&#xff0c;来加强我们对指针的理解。 1、题目 这是一道难题&#xff0c;小心哦。 #include <stdio.h> int main(…

蓝桥杯C++竞赛常用库函数介绍

文章目录 前言一、二分查找1. 二分查找的前提2.binary_search函数3.lower_bound函数和upper_bound函数4.蓝桥杯例题 二、最值查找1. min和max函数2.min_element和max_element函数3.nth_element函数4.蓝桥杯例题 三、排序1.sort函数2.sort自定义比较函数,或lambda表达式(匿名函数…

企业计算机服务器中了crypt勒索病毒怎么办,crypt勒索病毒解密数据恢复

计算机服务器设备为企业的生产运营提供了极大便利&#xff0c;企业的重要核心数据大多都存储在计算机服务器中&#xff0c;保护企业计算机服务器免遭勒索病毒攻击&#xff0c;是一项艰巨的工作任务。但即便很多企业都做好的了安全运维工作&#xff0c;依旧免不了被勒索病毒攻击…

hexo+gitee免费打造个人网站导航

一、准备工作 本文在win10系统下进行环境搭建 1.可参考官方文档 hexo官方网站 Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown&#xff08;或其他标记语言&#xff09;解析文章&#xff0c;在几秒内&#xff0c;即可利用靓丽的主题生成静态网页 2.配置环境 这…

最新版opencv4.9安装介绍,基本图像处理详解

文章目录 一、什么是OpenCV &#xff1f;二. OpenCV 安装1. 下载地址2.安装命令&#xff1a;pip install opencv-python 三、图像基础1. 基本概念2. 坐标系3. 基本操作&#xff08;彩色图片&#xff09;&#xff08;1&#xff09;读取图片&#xff1a;cv2.imread( )&#xff08…

PCB共模辐射是如何产生的

目录 引言 模型分析01 模型分析02 模型分析03 模型分析04

记一次供应链的heapdump泄露到云接管

本文由掌控安全学院 -杳若 投稿 打点 开局一张图 分析 框架分析 首先发现使用的是前端的vue框架 注意/#/&#xff0c;存在的话基本都是vue&#xff0c;这时候就要从找接口开始 浅试登录 任意输入账号密码点击登录 发现校验了手机号的问题&#xff0c;这时候换个功能点 浅…

【OpenAI Sora】 如何使用:最新详细教程-新手小白必看

Sora 是什么&#xff1f; 2024年2月16日&#xff0c;OpenAI 在其官网上面正式宣布推出文本生成视频的大模型 Sora: https://openai.com/sora &#xff08;PS&#xff1a;目前 openai 官方还未开放 sora 灰度&#xff0c;不过根据文生图模型 DALLE 案例&#xff0c;一定是先给…

Spring Cloud部署篇1——Jar包部署至CentOS云服务器

一、项目介绍 系统模块 com.mingink |--mingink-api // 接口模块 | └──mingink-api-system // 系统接口 |--mingink-common // 通用模块 | └──mingink-common-core // 系统接口 |--mingink-gateway…

未来已来:数字孪生与智慧园区的深度融合

目录 一、数字孪生技术的概述 二、智慧园区的概念和发展 三、数字孪生与智慧园区的深度融合 四、数字孪生与智慧园区的未来展望 五、结论 随着科技的飞速发展&#xff0c;我们正处在一个日新月异的时代。数字孪生技术作为新兴的前沿科技&#xff0c;已经引起了全球范围内的…

喜报 | 2023上海文创资金拟支持名单公布,优积科技上榜

2023年8月9日&#xff0c;上海市文化创意产业推进领导小组办公室公布了《2023年上海市促进文化创意产业发展财政扶持资金拟支持项目&#xff08;第一批&#xff09;公示》&#xff0c;优积科技本次以“人工智能技术赋能模块化建筑设计的创新应用”项目荣获该资金财政扶持。 优积…

如何用GPT进行成像光谱遥感数据处理?

第一&#xff1a;遥感科学 从摄影侦察到卫星图像 遥感的基本原理 遥感的典型应用 第二&#xff1a;ChatGPT ChatGPT可以做什么&#xff1f; ChatGPT演示使用 ChatGPT的未来 第三&#xff1a;prompt 提示词 Prompt技巧&#xff08;大几岁&#xff09; 最好的原则和策…

QT常用类

五、常用类 QString 字符串类&#xff08;掌握&#xff09; QString是Qt的字符串类&#xff0c;与C的std::string相比&#xff0c; 不再使用ASCII编码。QString使用的是Unicode编码。 QString中每个字符都是一个16位的QChar&#xff0c;而不是8位的char。 QString完全支持中文&…

模板(类模板)---C++

模板目录 2.类模板2.1 类模板语法2.2 类模板与函数模板区别2.3 类模板中成员函数创建时机2.4 类模板对象做函数参数2.5 类模板与继承2.6 类模板成员函数类外实现2.7 类模板分文件编写2.8 类模板与友元2.9 类模板案例 2.类模板 2.1 类模板语法 类模板作用&#xff1a; 建立一个…

2024 2.17~2.23 周报

一、本周计划 学习如何缝合模块&#xff0c;跑代码InversionNet、想idea并实验&#xff0c;准备开题报告&#xff0c;学习python基础语法 二、完成情况 1 学习如何在代码中加入模块 可添加的模块如&#xff1a; 通道注意力CA 空间注意力SA self attention变体 频域快速傅里…

漫漫数学之旅031

文章目录 经典格言数学习题古今评注名人小传 - 经典格言 如果没有数学知识&#xff0c;这个世界的事物是无法搞清楚的。——罗杰培根&#xff08;Roger Bacon&#xff09; 好的&#xff0c;各位看官&#xff0c;让我们来听听罗杰培根这位中世纪的“科学老顽童”是怎么说的&…