思路

  1. 主进程监听一个事件
  2. 渲染进程触发事件向主进程发送消息
  3. 主进程收到渲染进程的消息,给予渲染进程以响应
  4. 渲染进程收到主进程的响应

代码实现

主进程监听一个事件, 并且响应渲染进程
const {ipcMain} = require("electron")

ipcMain.on("sendMessage", (event, args) => {
  console.log("收到渲染进程的消息",  args);
  win.webContents.send("receiveMessage", "我是主进程已收到消息" + args); // 响应渲染进程
});
渲染进程触发主进程事件,并且监听主进程响应事件
<body>
    <button id="btn">发送通知</button>
  </body>
<script>
    const { ipcRenderer } = require("electron");
    const oBtn = document.getElementById("btn");

    oBtn.onclick = function () {
        ipcRenderer.send("sendMessage", "我是渲染进程");
    };
    ipcRenderer.on('receiveMessage', (event, args)=>{
        console.log('接收到主进程的消息',args)
    })
</script>

注意

  • 渲染进程需要集合node进程,否者会报Uncaught ReferenceError: require is not defined错误
const win = new BrowserWindow({
    // fullscreen: true,
    // transparent: true, // 窗口透明
    // frame: true, // 无边框
    // .......
    webPreferences: {
        nodeIntegration: true, // 集合node进程
    },
});
  • 主进程console打出的中文乱码处理, start的时候加上chcp 65001
"scripts": {
   "start": "chcp 65001 && electron index.js",
   "build": "electron-packager ./ --all --win --out ./dist --arch=x64 --overwrite"
},

完整代码

  • 主进程
// index.js
const path = require("path");
const { app, BrowserWindow, ipcMain } = require("electron");

function createWindow() {
  // 创建浏览器窗口
  const win = new BrowserWindow({
    // fullscreen: true,
    // transparent: true, // 窗口透明
    // frame: true, // 无边框
    webPreferences: {
      nodeIntegration: true, // 集合node进程
    },
  });

  win.loadFile("./app.html"); // 渲染进程网页

  ipcMain.on("sendMessage", (event, args) => {
    console.log("收到渲染进程的消息",  args);
    win.webContents.send("receiveMessage", "我是主进程已收到消息" + args);
  });
  win.webContents.openDevTools();  // 开启调试
}

app.whenReady().then(createWindow);
  • 渲染进程
<!--app.html-->

<!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>
    <button id="btn">发送通知</button>
  </body>
  <script>
    const { ipcRenderer } = require("electron");
    const oBtn = document.getElementById("btn");

    oBtn.onclick = function () {
      ipcRenderer.send("sendMessage", "我是渲染进程");
    };
    ipcRenderer.on('receiveMessage', (event, args)=>{
        console.log('接收到主进程的消息',args)
    })
  </script>
</html>

效果图

img


zpfei
186 声望7 粉丝

往事如风~