电子新手我已经弄清楚如何从Renderer发送到Main,但我正在尝试学习如何从Main到Renderer。在我的研究中,我读到:
IPC 从主进程发送到渲染器并尝试:
main.js:
const { app, ipcMain, Menu } = require('electron')
const appVersion = process.env.npm_package_version
const mainWindow = require('./renderer/mainWindow')
app.on('ready', () => {
mainWindow.createWindow(),
console.log(`Trying to send app version to renderer: ${appVersion}`),
mainWindow.webContents.send('app-version', appVersion),
Menu.setApplicationMenu(mainMenu)
})
Run Code Online (Sandbox Code Playgroud)
但我收到错误:
未捕获的异常类型错误无法读取未定义的属性“发送”
阅读“从 IpcMain 发送同步消息到 IpcRenderer - Electron ”后,我尝试了:
ipcMain.on('app-version', (event) => {
console.log(`Sent: ${appVersion}`)
event.sender.send(appVersion)
}),
Run Code Online (Sandbox Code Playgroud)
但没有任何反应或错误。我的渲染器.js:
const { ipcRenderer } = require('electron')
ipcRenderer.on('app-version', (event, res) => {
console.log(res) …Run Code Online (Sandbox Code Playgroud) 我正在创建一个以 vuejs 作为前端的电子应用程序。如何在 main.js 的单独文件中创建所有 ipcMain.on() 函数。我希望这是一个更干净的代码结构。
该应用程序必须离线工作,因此我需要将数据存储在本地数据库中。因此,当我在前端创建一个对象时,我将它与 ipcMain 发送到电子端。然后 Electron 可以将其写入本地数据库。
我想要这样的东西:
main.js:
import { app, protocol, BrowserWindow } from "electron";
import {
createProtocol,
installVueDevtools
} from "vue-cli-plugin-electron-builder/lib";
require("./ipcListeners.js");
Run Code Online (Sandbox Code Playgroud)
ipcListeners.js:
import { ipcMain } from "electron";
ipcMain.on("asynchronous-message", (event, arg) => {
console.log(arg);
event.reply("asynchronous-reply", "pong");
});
ipcMain.on("random-message", (event, arg) => {
console.log(arg);
event.reply("random-reply", "random");
});
Run Code Online (Sandbox Code Playgroud)
这里的问题是只有第一个 ipcMain.on() 函数起作用,但第二个函数......不起作用
Electron 中的 ipc 消息有顺序保证吗?如果有,它们是什么?
例如,在 main 中:
window.webContents.send('channel-a', 1)
window.webContents.send('channel-a', 2)
Run Code Online (Sandbox Code Playgroud)
在渲染器中:
ipcRenderer.on('channel-a', (_event, num) => console.log(num))
Run Code Online (Sandbox Code Playgroud)
消息是否始终按顺序传递到渲染器(例如上例中 1 在 2 之前)?
如果是这样,如果消息位于不同的通道上,它们是否也总是有序的(例如,通过更改channel-a为channel-b上面的某一行)?
我想检测特定的框架/浏览器窗口。我有一个主进程和两个浏览器窗口,这三个窗口都使用同一通道相互发送消息。在 IPCMain 中我需要检测其中之一。我看到 IPCmain 事件有一个名为frameId 的函数,但是当我使用它时,我得到了未定义。
ipcMain.once("postMessage", (event, message) => {
if(!activeRequest) return;
activeRequest.json(message).send();
});
Run Code Online (Sandbox Code Playgroud)