Electron 主進程和渲染進程互相通信


說明:

自主到從:從Main到Renderer的消息傳遞,借助BrowerWindow.webContents.send()發送消息。
自從到主:從Renderer到Main的消息傳遞,借助ipcRender和ipcMain發送/接收消息。
事件機制:無論是BrowerWindow.webContents.send(),還是ipc,其實都是node的事件機制,都是EventEmitter的實例。

1.主進程向渲染進程發送消息

主進程

const { app, BrowserWindow } = require('electron')
let win = null
 
app.on('ready', () => {
  win = new BrowserWindow({ width: 800, height: 600 })
  win.loadURL(`file://${__dirname}/index.html`)
  win.webContents.on('did-finish-load', () => {
    win.webContents.send('ping', 'whoooooooh!')
  })
})

index.html

<html>
<body>
  <script>
    require('electron').ipcRenderer.on('ping', (event, message) => {
      console.log(message) // Prints 'whoooooooh!',這里的message是object類型
    })
  </script>
</body>
</html>

2.渲染進程向主進程發送消息

index.html 

<!DOCTYPE html>
<html lang="en">
 
<head>
  <title>myapp</title>
</head>
 
<body>
  <input type="" name="" id="ipt" value="">
  <button type="button" onclick="connectMain()">和主進程通信</button>
 
  <script>
    const ipc = require('electron').ipcRenderer;
    var ipt = document.getElementById('ipt')
 
    function connectMain() {
      console.log('index.html', ipt.value);
      ipc.send('getMsg', ipt.value)
    }
  </script>
</body>
 
</html>

主進程

const ipc = require('electron').ipcMain
 
ipc.on('getMsg', (sys, msg) => {
  console.log(msg)  //接收窗口傳來的消息
})

3.主進程和渲染進程之間發送和處理消息

  • 回應同步消息, 可以設置 event.returnValue.
  • 回應異步消息, 可以使用 event.sender.send(...).

   例子,在主進程和渲染進程之間發送和處理消息:

(過程:渲染進程發消息->主進程接收消息並回復->渲染進程接收主進程的回復)

渲染進程:

// In renderer process (web page).
const ipcRenderer = require('electron').ipcRenderer;
console.log(ipcRenderer.sendSync('synchronous-message', 'ping')); // prints "pong"  發送同步消息
 
ipcRenderer.on('asynchronous-reply', function(event, arg) {    // 接收異步消息
  console.log(arg); // prints "pong"
});
ipcRenderer.send('asynchronous-message', 'ping');    // 發送異步消息

主進程:

// In main process.
const ipcMain = require('electron').ipcMain;
ipcMain.on('asynchronous-message', function(event, arg) {    // 接收異步消息
  console.log(arg);  // prints "ping"
  event.sender.send('asynchronous-reply', 'pong');     // 回應異步消息
});
 
ipcMain.on('synchronous-message', function(event, arg) {    // 接收同步消息
  console.log(arg);  // prints "ping"
  event.returnValue = 'pong';
});

參考:https://blog.csdn.net/weixin_42762089/article/details/87912222

參考官網:https://wizardforcel.gitbooks.io/electron-doc/content/api/ipc-main.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM