electron进程通信

本文详细介绍了在Electron应用中,如何通过单向通信(渲染器到主进程)打开文件、双向通信(渲染器与主进程异步交互)删除文件以及主进程与渲染器进程之间的消息传递。还展示了如何获取和传递应用版本号的例子。
摘要由CSDN通过智能技术生成

1.单向通信

从渲染器进程发送到主进程,您可以使用 ipcRenderer.send API 发送消息,然后使用 ipcMain.on API 接收。

举例:场景-->想要通过electron打开文件

渲染进程:

function openFile(selectFilePath){
 //selectFilePath想要打开的文件路径
 window.TEST.openFile(selectFilePath);
}

 预加载脚本preload.ts

import { contextBridge, ipcRenderer } from 'electron'
contextBridge.exposeInMainWorld("TEST", {
      openFile: (data) => ipcRenderer.send("open-file", data),
})

 主进程main.js

 ipcMain.on("open-file", (event, data) => {
      shell.openPath(data);//打开文件
    });

2.双向通信

从渲染器进程代码调用主进程模块并等待结果。 这可以通过将 ipcRenderer.invoke 与 ipcMain.handle 搭配使用来完成。

举例:场景-->想要通过node删除本地磁盘文件并拿到删除结果

渲染进程:

async function deleteFile(path) {
  const resultData = await window.TEST.deleteFile(path);
  if (resultData.status == "success") {
    ElMessage({
      showClose: true,
      message: "删除成功!",
      type: "success",
    });
  }
}

 预加载脚本preload.ts

import { contextBridge, ipcRenderer } from 'electron'
contextBridge.exposeInMainWorld("TEST", {
     deleteFile: (data) => ipcRenderer.invoke("delete-file", data),
})

 主进程main.js

ipcMain.handle("delete-file",  (event, path) => {
      return new Promise((resolve, reject) => {
    let sendData = {
      status: "",
      message: "",
    };
    fs.stat(path, (exists) => {
      if (exists) {
        sendData.message = "当前不存在!";
        resolve(sendData);
      } else {
        fs.unlink(path, (err) => {
          if (err) {
            sendData.status = "fail";
            resolve(sendData);
          } else {
            sendData.status = "success";

            resolve(sendData);
          }
        });
      }
    });
  });
    });

3. 主进程到渲染器进程(双向)

从主进程发送到渲染器进程时,需要指定是哪一个渲染器接收消息。 消息需要通过 WebContents 发送到渲染器进程,预加载脚本通过ipcRenderer.on去接收

举例:场景-->通过node拿到当前应用版本号,传给渲染进程,并得到答复

 主进程main.js

mainWindow.webContents.send("app-version", app.getVersion());
//拿到渲染进程的回复
ipcMain.on('status', (_event, value) => {
  console.log(value) // 将打印到 Node 控制台
})

 预加载脚本preload.ts

import { contextBridge, ipcRenderer } from 'electron'
contextBridge.exposeInMainWorld("TEST", {
    appVersion: (callback) => ipcRenderer.on("app-version", callback),
})

渲染进程

 window.TEST.appVersion((_event, data) => {
    global.appVersion = data;
  _event.sender.send('status', '已受到') // 发送消息到主进程
  });

4. 渲染器进程到渲染器进程

这个还没用过,后续更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值