1

我正在尝试将文本从一个窗口发送到另一个窗口,但我做不到

这是我主要听的地方

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

我可以在 console.log 中看到终端中的文本,但是当我尝试将文本“hi from main”发送到 window2 时,没有被调用。

这是window2代码

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

这很奇怪,因为如果我在 window1 工作中做同样的事情。这是我调用 IpcMain 的 window1 的代码

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

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

1 回答 1

1

window2在向其发送任何内容之前,您需要等待加载。因此,请确保它返回一个承诺。

设置一个did-finish-load监听器并解决其中的承诺。

主要的

// 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()
    })
  })
}
于 2020-07-22T11:36:21.800 回答