[Electron]中IPC进程间通信

Electron中IPC

进程间通信 (IPC) 是在 Electron 中构建功能丰富的桌面应用程序的关键部分之一。在 Electron 中,进程使用 ipcMain 和 ipcRenderer 模块,通过开发人员定义的“通道”传递消息来进行通信。

本文介绍以下几个方面:

  • 1-渲染进程到主进程(单项)

ipcRender.send()
  • 2-主进程到渲染进程(单项)

WebContents.send()
  • 3-渲染进程到到主进程(双向)

ipcRender.invoke(渲染进程)
ipcMain.handle(主进程)

1.渲染进程到主进程

  • 渲染进程通过ipcRender.send()API发送消息

  • 主进程通过ipcMain.on()API接受信息

2.主进程到渲染进程

  • 主进程通过WebContents.send()发送数据

  • 渲染进程通过ipcRender.on()获取数据

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

  • 渲染进程通过invoke调用API

  • 主进程通过handle处理API

示例

功能:

  • 渲染进程发送111到主进程

  • 主进程发送222到渲染进程

  • 渲染进程invoke主进程

// main.js
const { app, BrowserWindow,ipcMain } = require("electron")
const path = require("path")
var id = "";
const createWindow = () => {
    const win = new BrowserWindow({
        width: 800,
        height: 600,
        show: false,
        webPreferences:{
            preload:path.join(__dirname,"./preload.js")
        }
    })
    win.loadFile("./index.html")
    win.show()
    id = win.id
}
​
app.whenReady().then(() => {
    createWindow()
})
​
ipcMain.on("messageToMain",(event,text)=>{
    // ipcMain.on 来接收渲染进程发送的数据
    console.log("主进程从渲染进程接收到的数据:"+text);
    // 获取当前窗口
    // BrowserWindow.webContents.send 发送数据
   BrowserWindow.fromId(id).webContents.send("messageFromMain","222")
})
​
// ipcMain.handle 返回invoke调用
ipcMain.handle("getData",()=>{
    return "333"
})
​
​
app.on("window-all-closed", () => {
    app.quit()
})
// preload.js
const { contextBridge, ipcRenderer } = require("electron")
contextBridge.exposeInMainWorld("electronIpc", {
    // 预加载脚本暴露 ipcRenderer.send
    send: (text) => { ipcRenderer.send('messageToMain', text) },
    // 预加载脚本暴露 ipcRenderer.on
    onGet: (callback) => {
        ipcRenderer.on("messageFromMain", (event, text) => {
            callback(text)
        })
    },
    // 预加载脚本暴露 ipcRenderer.invoke
    getData: () => { return ipcRenderer.invoke("getData") }
})
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Electron的ipc通讯</title>
</head>
<body>
    <h2>渲染进程到主进程(单向)</h2>
    <div>
        <button id="btnToMain">渲染进程发送到主进程</button>
    </div>
    <div>
        <input type="text" id="sendText">
    </div>
    <br>
    <br>
    <div>收到主进程发送到渲染进程的消息:</div>
    <div>
        <input type="text" id="messageFromMain" style="width: 300px;">
    </div>
    <br>
    <div>
        <button id="btnInvoke">渲染进程invoke主进程</button>
    </div>
    <div>
        <input type="text" id="messageInvokeMain" style="width: 300px;">
    </div>
     <script src="./index.js"></script>
</body>
</html>
// index.js
window.onload = () => {
    var btnToMain = document.getElementById("btnToMain");
    btnToMain.addEventListener("click", () => {
        var sendText = document.getElementById("sendText").value;
        window.electronIpc.send(sendText)
    })
​
    window.electronIpc.onGet((text) => {
        var messageFromMain = document.getElementById("messageFromMain");
        messageFromMain.value = text;
    })
​
    var btnInvoke = document.getElementById("btnInvoke");
    btnInvoke.addEventListener("click",async ()=>{
        var getData = await window.electronIpc.getData();
        var messageInvokeMain = document.getElementById("messageInvokeMain");
        messageInvokeMain.value = getData;
    })
}

效果

相关推荐

  1. Electron vue 进程消息通行

    2024-03-12 00:20:03       14 阅读
  2. 【Linux】进程通信IPC机制

    2024-03-12 00:20:03       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-12 00:20:03       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-12 00:20:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-12 00:20:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-12 00:20:03       20 阅读

热门阅读

  1. 【IVA】加速计算中常用的硬件

    2024-03-12 00:20:03       17 阅读
  2. Vue教学16:探索Element UI,开启Vue项目创建之旅

    2024-03-12 00:20:03       20 阅读
  3. 第6章---GameplayTag初识以及拾起物品UI制作

    2024-03-12 00:20:03       17 阅读
  4. hdu 2079 选课时间

    2024-03-12 00:20:03       21 阅读
  5. openssl3.2 - exp - AES-256-GCM

    2024-03-12 00:20:03       16 阅读
  6. OpenSSL 安全漏洞(CVE-2023-3817)

    2024-03-12 00:20:03       20 阅读
  7. 安卓文件管理器

    2024-03-12 00:20:03       19 阅读
  8. Golang 方法的接收器 receiver 指针和值的区别

    2024-03-12 00:20:03       18 阅读
  9. vue知识点杂记

    2024-03-12 00:20:03       20 阅读