Electron的学习

news2024/12/23 8:08:45

目录

      • 项目初始化可以看官网非常详细
      • 根路径创建.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"); //icon
  event.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-1
    return 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.coloradmin.cn/o/1562294.html

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

相关文章

基于ArgoCD和Testkube打造GitOps驱动的Kubernetes测试环境

本文介绍了一项新工具&#xff0c;可以基于Gitops手动或者自动实现Kubernetes集群应用测试&#xff0c;确保集群的健康状态与Git仓库定义的一致。原文: GitOps-Powered Kubernetes Testing Machine: ArgoCD Testkube 简介&#xff1a;GitOps 云原生测试面临的挑战 现代云原生应…

Qt中出现中文乱码的原因以及解决方法

Qt专栏&#xff1a;http://t.csdnimg.cn/C2SDN 目录 1.引言 2.原因分析 3.源文件的编码格式修改方法 4.程序内部使用的默认编码格式修改方法 5.QString转std::string的方法 6.总结 1.引言 在编写Qt程序的时候&#xff0c;或多或少都可能遇到用QString时候&#xff0c;明明…

游戏APP如何提高广告变现收益的同时,保证用户留存率?

APP广告变现对接第三方聚合广告平台主要通过SDK文档对接&#xff0c;一些媒体APP不具备专业运营广告变现的对接能力和资源沉淀&#xff0c;导致APP被封控&#xff0c;设置列入黑名单&#xff0c;借助第三方聚合广告平台进行商业化变现是最佳选择。#APP广告变现# 接入第三方平台…

51单片机入门:认识开发板

认识开发板 板载资源&#xff1a; 数码管模块 说明&#xff1a; 2个四位一体共阴数码管 详细&#xff1a; 2个四位一体&#xff1a;两个独立的四位数码管&#xff0c;每个四位数码管都是“一体”的设计&#xff0c;也就是说&#xff0c;每个数码管内部集成了四个独立的七段LE…

Stable Diffusion WebUI 附加功能/图片放大(Extras):单张图片/批量处理/从目录进行批量处理

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 篇文章主要讲解 Stable Diffusion WebUI 的附加功能/图片放大&#xff08;Extras&#xff09;的使用&#xff0c;主要…

JAV八股--redis

如何保证Redis和数据库数据一致性 关于异步通知中消息队列和Canal的内容。 redisson实现的分布式锁的主从一致性 明天继续深入看这个系列问题 介绍IO复用模型

WebSocket用户验证

在WebSocket中&#xff0c;如何携带用户的验证信息 一、在OnMessage中进行验证 客户端在连接到服务器后&#xff0c;客户端通过发送消息&#xff0c;服务器端在OnMessage方法中&#xff0c;进行信息验证&#xff0c;这种方式需要将用户身份验证及接收用户消息进行混合处理&am…

什么是原生IP?原生IP的作用是什么?

原生IP&#xff08;Native IP&#xff09;是指直接从互联网服务提供商&#xff08;ISP&#xff09;获得的IP地址&#xff0c;而非通过代理服务器、VPN或其他中间层方式获取。这种IP地址直接与用户的设备或网络关联&#xff0c;无需经过任何中间服务器或代理的转发或隐藏&#x…

体验OceanBase 的binlog service

OceanBase对MySQL具备很好的兼容性。目前&#xff0c;已经发布了开源版的binlog service工具&#xff0c;该工具能够将OceanBase特有的clog模式转换成binlog模式&#xff0c;以便下游工具如canal、flink cdc等使用。今天&#xff0c;我们就来简单体验一下这个binlog service的功…

Educational Codeforces Round 163 (Rated for Div. 2) E. Clique Partition

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e9, maxm 4e4 5; co…

MacBook 访达使用技巧【mac 入门】

快捷键 打开访达搜索窗口默认快捷键【⌥ ⌘ 空格键】可以在键盘【系统偏好设置 -> 键盘->快捷键->聚焦】修改 但是我不会去修改它&#xff0c;因为我不常用访达的搜索窗口&#xff0c;更多的是想快速打开访达文件夹窗口&#xff0c;可以通过第三方软件定义访达的快…

测开——Java、python、SQL、数据结构面试题整理

一、Java 1.Java中finally、final、finalize的区别 1.性质不同 &#xff08;1&#xff09;final为关键字; &#xff08;2&#xff09;finalize()为方法; &#xff08;3&#xff09;finally为为区块标志,用于try语句中; 2. 作用 &#xff08;1&#xff09;final为用于标识…

【通信原理笔记】【三】模拟信号调制——3.2 双边带抑制载波调制(DSB-SC)

文章目录 前言一、DSB-SC的数学表示二、DSB-SC的相干解调三、DSB-SC的性能评价总结 前言 从这一篇开始我们依次介绍几种模拟信号调制的方法&#xff0c;包括其数学表达式&#xff0c;系统框图、解调方式、性能评价等。 一、DSB-SC的数学表示 将 m ( t ) m(t) m(t)作为已调信号…

前端、后端上传文件到OSS,简明记录

前端、后端上传文件到OSS&#xff0c;简明记录 上传文件到oss的方式&#xff1a; **后端上传&#xff1a;**文件先要从页面上传到后端存起来&#xff0c;再通过后端发送到oss&#xff0c;然后后端将存起来的文件删除&#xff08;当然可以不删&#xff09;。 **前端上传&…

win11安装WSL UbuntuTLS

win11安装WSL WSL 简介WSL 1 VS WSL 2先决要求安装方法一键安装通过「控制面板」安装 WSL 基本命令Linux发行版安装Ubuntu初始化相关设置root用户密码网络工具安装安装1panel面板指导 WSl可视化工具问题总结WSL更新命令错误Ubuntu 启动初始化错误未解决问题 WSL 简介 Windows …

4-Linux实用操作

1. 各类小技巧&#xff08;快捷键&#xff09; 1.1 ctrl c 强制停止 Linux 某些程序的运行&#xff0c;如果想要强制停止它&#xff0c;可以使用快捷键 ctrl c 命令输入错误&#xff0c;也可以通过快捷键 ctrl c&#xff0c;退出当前输入&#xff0c;重新输入 1.2 ctrl …

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

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

NoSQL之 Redis配置

目录 关系数据库与非关系型数据库 关系型数据库&#xff1a; ●非关系型数据库 关系型数据库和非关系型数据库区别&#xff1a; &#xff08;1&#xff09;数据存储方式不同 &#xff08;2&#xff09;扩展方式不同 对事务性的支持不同 非关系型数据库产生背景 Redis简介…

利用Node.js实现拉勾网数据爬取

引言 拉勾网作为中国领先的互联网招聘平台&#xff0c;汇集了丰富的职位信息&#xff0c;对于求职者和人力资源专业人士来说是一个宝贵的数据源。通过编写网络爬虫程序&#xff0c;我们可以自动化地收集这些信息&#xff0c;为求职决策和市场研究提供数据支持。Node.js以其非阻…

Intel FPGA (2):线性序列机

Intel FPGA (2)&#xff1a;线性序列机 前提摘要 个人说明&#xff1a; 限于时间紧迫以及作者水平有限&#xff0c;本文错误、疏漏之处恐不在少数&#xff0c;恳请读者批评指正。意见请留言或者发送邮件至&#xff1a;“Email:noahpanzzzgmail.com”。本博客的工程文件均存放在…