2017-02-18 156 views
1

我的主要过程(重要的代码):Electron IPC:为什么我的ipc信息没有被接收?

let introWindow 
let win = null 

function createWindow() { 
    // Create the browser window. 
    introWindow = new BrowserWindow({ 
      width: 600, 
      height: 480, 
      title: "Glaze", 
      resizable: false 
     }) 
     // and load the index.html of the app. 


    introWindow.loadURL(url.format({ 
      pathname: path.join(__dirname, 'src/html/start.html'), 
      protocol: 'file:', 
      slashes: true 
     })) 

    // Emitted when the window is closed. 
    introWindow.on('closed', function() { 
     // Dereference the window object, usually you would store windows 
     // in an array if your app supports multi windows, this is the time 
     // when you should delete the corresponding element. 
     introWindow = null 
    }) 
} 

function createMainWindow(arg) { 
    const htmlPath = path.join('file://', __dirname, 'src/html/index.html?room=' + arg.room + "&nick=" + arg.nick) 
    win = new BrowserWindow({ 
      width: 800, 
      height: 700, 
      title: "Glaze" 
     }) 
    win.on('closed', function() { 
     win = null; 
    }) 

    win.loadURL(htmlPath) 
    win.show() 

    win.webContents.send('message', "IT WORKED!"); 

    autoUpdater.on('checking-for-update',() => { 
    sendStatus('Checking for update...'); 
    }) 
    autoUpdater.on('update-available', (ev, info) => { 
    sendStatus('Update available.'); 
    }) 
    autoUpdater.on('update-not-available', (ev, info) => { 
    sendStatus('Update not available.'); 
    }) 
    autoUpdater.on('error', (ev, err) => { 
    sendStatus('Error in auto-updater.'); 
    }) 
    autoUpdater.on('download-progress', (ev, progressObj) => { 
    sendStatus('Download progress...'); 
    log.info('progressObj', progressObj); 
    }) 
    autoUpdater.on('update-downloaded', (ev, info) => { 
    sendStatus('Update downloaded. Will quit and install in 5 seconds.'); 
    // Wait 5 seconds, then quit and install 
    setTimeout(function() { 
     autoUpdater.quitAndInstall(); 
    }, 5000) 
    }) 
    // Wait a second for the window to exist before checking for updates. 
    setTimeout(function() { 
    autoUpdater.checkForUpdates() 
}, 5000); 
} 

// This method will be called when Electron has finished 
// initialization and is ready to create browser windows. 
// Some APIs can only be used after this event occurs. 
app.on('ready', function() { 
     const menu = Menu.buildFromTemplate(template) 
     Menu.setApplicationMenu(menu) 
     createWindow() 

}) 

// Quit when all windows are closed. 
app.on('window-all-closed', function() { 
    let reopenMenuItem = findReopenMenuItem() 
    if (reopenMenuItem) reopenMenuItem.enabled = true 
    // On OS X it is common for applications and their menu bar 
    // to stay active until the user quits explicitly with Cmd + Q 
    if (process.platform !== 'darwin') { 
     app.quit() 
    } 
}) 

app.on('activate', function() { 
    // On OS X it's common to re-create a window in the app when the 
    // dock icon is clicked and there are no other windows open. 
    if (introWindow === null && win === null) { 
     createWindow() 
    } 
}) 

// In this file you can include the rest of your app's specific main process 
// code. You can also put them in separate files and require them here. 

app.on('browser-window-created', function() { 
    let reopenMenuItem = findReopenMenuItem() 
    if (reopenMenuItem) reopenMenuItem.enabled = false 
}) 



ipc.on('close-starter', function(event, arg) { 
    createMainWindow(arg); 
}) 





function sendStatus(text) { 
    log.info(text); 
    win.webContents.send('message', text); 
} 

而且我的index.html:

<script> 
    const ipc = require('electron').ipcRenderer; 
    ipc.on('message', function(event, text) { 
     console.log("Message received") 
     console.log(text, event); 
     var container = document.getElementById('messages'); 
     var message = document.createElement('div'); 
     message.innerHTML = text; 
     container.appendChild(message); 
    }) 

    console.log("ran") 
</script> 

当我运行我的应用程序,我查一下我的win窗口开发者工具控制台和没有消息打印出来,除了ran注意到该文件运行。为什么ipc消息没有通过?当调用.send时,win不应该等于null。问题可以与我的主文件或我的接收文件?

+0

当我说控制台,我指的是开发工具的控制台。是的,我已经试过@pergy – adamSiwiec

+0

我看到了,ofc。如果你只发送''('dom-ready')'? – pergy

+0

你是什么意思? – adamSiwiec

回答

3

作为我评论的总结,ipc频道只有在成功安装webContents后才能使用。因此,您应该将您的send呼叫置于回调中,以确保ipc频道处于服务状态。

send示例代码documentation在做同样的事情:

// In the main process. 
const {app, BrowserWindow} = require('electron') 
let win = null 

app.on('ready',() => { 
    win = new BrowserWindow({width: 800, height: 600}) 
    win.loadURL(`file://${__dirname}/index.html`) 
    win.webContents.on('did-finish-load',() => { 
    win.webContents.send('ping', 'whoooooooh!') 
    }) 
})