electron与外部程序通信,electron 主进程和渲染进程通信

  electron与外部程序通信,electron 主进程和渲染进程通信

  主要介绍电子进程间通信的实现,通过实例代码详细介绍,有一定的参考价值,有兴趣的朋友可以参考一下。

  

目录

  主进程与渲染进程之间的通信ipc模块window . web contents远程模块渲染进程之间的通信电子开发的桌面应用程序是多进程的,包括一个主进程和至少一个渲染器。

  主进程控制整个应用的生命周期,通过电子中的一些模块与GUI交互,同时控制各个渲染进程。

  渲染进程会在BrowserWindow对象创建的窗口中渲染网页,每个渲染的页面都会在一个独立的进程中运行。

  

主进程与渲染进程之间通信

  

ipc模块 + window.webContents

  Ipc模块包括ipcMain和ipcRenderer两个模块,其中ipcMain用于主进程,ipcRenderer用于渲染进程。使用前,应根据需要介绍相应的模块。

  ipc模块中的方法:

  IPC.on (msg,()={}):监听渲染进程发送的msg消息,做出响应。Ipc.once (msg,()={}):监听渲染进程发送的msg消息,并对其进行响应,但监听到一个msg事件后会自动移除此监听器。IpcRenderer.on(msg,()={}):监听主进程发送的msg消息并响应。IpcRenderer.once(msg,()={}):监听主进程发送的msg消息并响应,但监听一个msg事件后自动移除此监听程序。IpcRenderer.send(msg,data):监控渲染进程向主进程发送msg异步消息,携带参数数据。IpcRenderer.sendSync(msg,data):监听渲染进程向主进程发送msg同步消息,携带参数IPC renderer . send to(web contentid,msg,Data):监听渲染进程发送消息ipcRenderer.sendToHost(msg,Data):监听渲染进程向宿主页面上的webview元素发送消息。ipc模块还提供了删除指定监听器和删除所有监听器的方法:removeListener()和removeAllListener()。这两种方法在ipcMain和ipcRenderer中的用法相同。

  通过上面的监听器,我们发现单独使用ipc模块是无法实现主进程主动向渲染进程发送消息的。所以我一般在BrowserWindow实例中结合ipc模块使用webContents。

  一个主进程与渲染进程间通信的例子

  //在主进程中使用ipcMain

  const { ipcMain,BrowserWindow }=require(电子);

  window=new BrowserWindow({

  宽度:800,

  身高:600

  });

  //主进程主动向渲染进程发送消息。

  window.webContents.send(主webContents msg ,data);

  //主进程接收渲染进程发送的消息,通过回调函数响应。

  ipcMain.on(renderer ipc msg ,(event,arg)={

  //做某事

  })

  //在渲染过程中使用ipcRender

  const IPC render=require( electron );

  //在渲染过程中使用ipcRenderer.on接收主进程消息,使用回调函数做出相应的响应。

  IPC renderer . on( main web contents msg ,(event,arg)={

  //当对应的主流程事件发生时,通过ipcRenderer.send方法发送另一个类似主流程的消息。

  IPC renderer . send( renderer IPC msg ,data);

  })

  ipcRenderer发送的同步消息和异步消息

  上面列出的方法中,ipcRenderer发送消息的方法分为发送同步消息的方法ipcRenderer.send和发送异步消息的方法ipcRenderer.sendSync,当主程序监听到这两种不同方法的消息时,可以用不同的方式向渲染进程返回消息:

  //渲染过程

  //呈现过程发送异步消息

  ipcRenderer.send(msg ,data);

  //呈现过程发送同步消息。发送同步消息,任务未完成时其他操作将被阻止。

  var message=IPC renderer . sendsync( sync msg ,data);

  ipcMain.on(msg ,(event,arg)={

  //主进程监听渲染进程发送的异步消息后,通过event.sender.send()的方式进行响应。可以使用ipcRenderer.on在渲染过程中监听“return msg”消息。

  event.sender.send(return msg ,data)

  })

  ipcMain.on(sync msg ,(event,arg)={

  event.retuenValue= msg

  })

  

remote模块

  在渲染过程中使用remote,可以调用主进程提供的一些方法。(例如:对话框、菜单等模块)

  const { BrowserWindow }=require(电子)。远程;

  //通过remote模块,可以在渲染过程中调用BrowserWindow模块。

  let win=new browser window({ width:800,height:600 });

  win . loadurl( index . html );

  远程模块在渲染过程中返回的对象都代表主进程中的一个对象,一般称为远程对象。当调用远程对象的方法时,您实际上是在向主进程发送同步消息。

  比如上面的代码中,Browserwindow实例是通过remote模块返回的,所以渲染过程中BrowserWindow和Win都是远程对象。当新的浏览器窗口({.})代码执行,不是在渲染进程中创建BrowserWindow实例对象,而是在主进程中创建BrowserWindow对象并返回给渲染进程。

  远程的方法和属性

  Remote.require(module):返回主进程中的对象remote . getcurrentwindow();返回此网页所属的窗口remote.getGlobal(name );返回主进程中的全局变量remote.process的名称;返回主进程中的进程对象。

  

渲染进程之间通信

  上面提到的通信方式,经过测试,都是无法在渲染进程之间直接通信的。有时,我们可以使用主进程作为开发中渲染进程之间通信的中转:

  //渲染器进程A

  const { IPC renderer }=require( electron );

  ipcRenderer.send(A send msg ,data);

  //主进程

  const { ipcMain,BrowserWindow }=require(电子);

  let win=new BrowserWindow({.});

  ipcMain.on(A send msg ,(event,arg)={

  //做某事

  win.webContents.send(主发送消息,数据);

  })

  const { IPC renderer }=require( electron );

  ipcRenderer.on(main send msg ,(event,arg)={

  //做某事

  })

  除了上述需要主进程中转的方法之外,还有另一种方法可以实现渲染进程之间的直接通信:

  //主进程

  //两个窗口互相获取对方的窗口id,并发送给渲染进程。

  const { BrowserWindow}=require(电子);

  让win1=new BrowserWindow({.});

  让win2=new BrowserWindow({.});

  win 1 . web contents . send( distribute ids ,{

  win2Id : win2.id

  });

  win 2 . web contents . send( distributeIds ,{

  win1Id : win1.id

  });

  //渲染器进程

  const { remote }=require(电子)。远程;

  //fromId()可以根据窗口Id找到目标窗口

  远程。browser window . fromid(win2Id). web contents . send( msg ,data);

  这就是本文关于电子进程间通信的实现。有关电子进程间通信的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: