web-dev-qa-db-ja.com

電子-IPC-ウィンドウ間でデータを送信する

メインプロセスでは、mainWindowというウィンドウを作成します。ボタンをクリックすると、browserWindowという新しいnotesWindowが作成されます。

私がやりたいのは、notesWindowからmainWindowにデータを送信することです

私がしたことは使用されますIPC sendは最初にnotesWindowからメインプロセスにデータを送信し、メインプロセスでデータを取得し、次にそのデータをmainWindow、ただしmainWindowは送信者イベントを受信できません。メインプロセスへのデータの送信は正常に機能しますが、メインプロセスからbrowserWindowへのデータは機能していないようです。

main.js

const ipcMain = require('electron').ipcMain;

ipcMain.on('notes', function(event, data) {
      console.log(data) // this properly shows the data
      event.sender.send('notes2', data);
});

noteWindow.js

const ipcRenderer = require('electron').ipcRenderer;
ipcRenderer.send('notes', "new note");

mainWindow.js

const ipcRenderer = require("electron").ipcRenderer;
ipcRenderer.on('notes2', function(event, data) {
    // this function never gets called
    console.log(data);
});

誰かが私が間違っていることを説明できますか?前もって感謝します!

10
Harmonic

mainWindowは、送信されていないため、イベントを受信できません。 _main.js_のevents.sender.send()コードは、notesイベントを送信した人(この場合はnoteWindow)にデータを送り返します。したがって、_notes2_イベントは、noteWindowではなくmainWindowに送り返されます。

_notes2_イベントをmainWindowに送信するには、 webContents.send() を確認してください。これにより、メインプロセスはイベントを介して特定のウィンドウにデータを送信できます。 _main.js_をいくつか変更すると、次のようになります。

_ipcMain.on('notes', function(event, data) {
    mainWindow.webContents.send('notes2', data);
});
_
7
Arnelle Balane

_main.js_でipcハブをセットアップする必要はありません。ここに私がそれをする方法があります。

ここで重要なのは、rendererがお互いを知る必要があるgetCurrentWebContents().id間で直接ipcトークを行う場合です。

手順1:メインウィンドウのグローバルオブジェクトを作成する

main.js

_function createWindow() {
    mainWindow = new BrowserWindow(...);

    global.mainWindow = mainWindow;

    ...
}
_

ステップ2:データをメインウィンドウに送信(および受信)

noteWindow.js

_const ipc = require("electron").ipcRenderer;
ipc.sendTo(
          getGlobal("mainWindow").webContents.id,
          "ChannelForMainWindow",
          data,
          web_component.id // for main window to send back
        );
_

mainWindow.js

_ipc.on("ChannelForMainWindow", (e, data, web_component_id) => {
    // do something
});
_

(オプション)ステップ3:データを送り返す(そして受信する)

noteWindow.js

メインウィンドウの応答(もしあれば)のリスナーを追加しましょう

_const ipc = require("electron").ipcRenderer;

ipc.on("ChannelForNoteWindow", e => {
    ...
});

ipc.sendTo(
          getGlobal("mainWindow").webContents.id,
          "ChannelForMainWindow",
          data,
          web_component.id // for main window to send back
        );
_

mainWindow.js

_ipc.on("ChannelForMainWindow", (e, data, web_component_id) => {
    // do something

    //send data back
    ipc.sendTo(web_component_id, "ChannelForNoteWindow");
});
_
0
Ben