Electronjs ipcMain doesn't send message to another window with ipcRenderer

1.1k Views Asked by At

I'm trying to send an text from one window to another, but I can't do it

This is where my main listen

ipcMain.on('fromRenderer1', (e,arg) => {
    createWindow2()    
    console.log(arg)
    window2.webContents.on("toRenderer2",()=>{
       window2.webContents.send("toRenderer2","hi from main")
    })    
})

I can see the text in terminal in the console.log but when I try send the text "hi from main" to the window2, isn't called.

This is the window2 code

const { ipcRenderer } = require("electron");
ipcRenderer.on('toRenderer2',(event,arg) =>{
      console.log(arg)    
})

It's weird because if I do the same in window1 work. This is the code of window1 where I call to the IpcMain

const { ipcRenderer } = require("electron");

ipcRenderer.send('fromRenderer1','hi from renderer1');
1

There are 1 best solutions below

0
On

You need to wait for the window2 to load before sending anything to it. So make sure it returns a promise.

Set up a did-finish-load listener and resolve the promise in it.

Main

// Keep global references so they don't get garbage collected
let window2

// Create listener for renderer-1
ipcMain.on('from-renderer-1', (event, payload) => {
  createWindow2()
    .then(() => {
      window2.webContents.send('message-1', payload)      
    })
})

// Create 'reply' listener for renderer-1
ipcMain.on('message-1-reply', (event, data) => {
  window1.webContents.send('message-1-reply-for-renderer-1', data)
  if (window2) {
    window2.close()
  }
})

function createWindow2 () {
  return new Promise((resolve, reject) => {
    const developmentPath = `${process.env.WEBPACK_DEV_SERVER_URL}/window2.html`
    const productionPath = 'app://./window2.html'
    window2 = new BrowserWindow({ ... })
    // Load window URL
    if (process.env.WEBPACK_DEV_SERVER_URL) {
      window2.loadURL(developmentPath)
    } 
    else {
      window2.loadURL(productionPath)
    }
    // Create 'close' listener
    window2.on('closed', () => {
      window2 = null
    })
    // Create 'did-finish-load' listener 
    window2.webContents.on('did-finish-load', () => {
      resolve()
    })
  })
}