Electron 主进程和渲染进程的通信主要用到两个模块:ipcMain 和 ipcRenderer
ipcMain:当在主进程中使用时,它处理从渲染器进程(网页)发送出来的异步和同步信息,当然也有可能从主进程向渲染进程发送消息。
ipcRenderer: 使用它提供的一些方法从渲染进程 (web 页面) 发送同步或异步的消息到主进程。 也可以接收主进程回复的消息。
const { app, BrowserWindow } = require("electron"); const path = require("path"); const createWindow = () => { const mainWindow = new BrowserWindow({ width: 800, height: 600, webPreferences:{ nodeIntegration:true, //开启渲染进程中使用nodejs contextIsolation:false, //开启渲染进程中使用nodejs } }); //在渲染进程中开启调试模式 mainWindow.webContents.openDevTools() mainWindow.loadFile(path.join(__dirname, "index.html")); //自定义右键菜单 require('./ipcMain/contextMenu'); } //监听应用的启动事件 app.on("ready", createWindow) //监听窗口关闭的事件,关闭的时候退出应用,macOs 需要排除 app.on('window-all-closed', () => { if (process.platform !== 'darwin') { app.quit(); } }); //Macos 中点击 dock 中的应用图标的时候重新创建窗口 app.on('activate', () => { if (BrowserWindow.getAllWindows().length === 0) { createWindow(); } });
index.html引入渲染进程index.js,利用ipcRenderer给主进程发送了一个消息
const { ipcRenderer } = require('electron'); window.onload=()=>{ //右键菜单 window.addEventListener("contextmenu", (e) => { e.preventDefault() //弹出右键菜单 menuBuilder.popup({window:remote.getCurrentWindow()}); ipcRenderer.send("showContextmenu"); }, false) }
contextMenu.js,主进程中监听消息 弹出菜单
const { Menu,ipcMain,BrowserWindow } = require("electron"); var contextTemplate = [ { label: '复制', role: 'copy' }, { label: '黏贴', role: 'paste' }, { type: 'separator' }, //分隔线 { label: '其他功能', click: () => { console.log('click') } } ]; var menuBuilder=Menu.buildFromTemplate(contextTemplate); //监听右键菜单 ipcMain.on("showContextmenu",()=>{ //渲染进程中获取当前窗口的方法 remote.getCurrentWindow() //主进程中获取当前窗口的方法 BrowserWindow.getFocusedWindow() menuBuilder.popup({window:BrowserWindow.getFocusedWindow()}); })
留下您的脚步
最近评论