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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。