问题标签 [ipcmain]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
16067 浏览

javascript - 为什么我的 ipcMain 没有发送到 Electron 中的 ipcRenderer?

电子新手我已经知道如何从Renderer发送到Main但我正在尝试学习如何从MainRenderer。在我的研究中,我读到:

IPC 从主进程发送到渲染器并尝试:

主.js

但我得到一个错误:

未捕获的异常类型错误无法读取未定义的属性“发送”

在阅读“从 IpcMain 向 IpcRenderer - Electron 发送同步消息”之后,我尝试了:

但没有任何反应或错误。我的renderer.js

为什么我的ipcMain没有发送到我的ipcRenderer

编辑:

主窗口.js

我也试过:

主.js

渲染器.js

出于某种原因,现在我编写的应用答案 ipcMain 多次发送到渲染器并重复渲染控制台消息

现在应用程序闪烁,但在console.log它显示一次,我不明白为什么。

编辑

回应答案

我知道app.getVersion我只是在使用ENV用来学习如何发送到主目录。测试代码后,这种方法不起作用。

应对:

引发以下错误:

const 声明中缺少初始化程序

所以修改为:

但是在末尾添加 return 时exports.createWindow会引发以下错误:

win 未定义

添加let.win之前exports.createWindow不会抛出代码,但不会发送任何内容。


电子小提琴

索引.html:

主.js:

渲染器.js:

0 投票
0 回答
467 浏览

javascript - Electron ipcRenderer.send 的问题

我有一个电子应用程序。它通过 renderer.js 中的 ipcRenderer.send 向 index.js 中的 ipcMain.on 侦听器发送下载事件:

渲染器.js:

index.js:

所以它应该下载(感谢 electron-dl npm 包)project.files 下的所有文件,并将它们保存在 info.location 下。

当 data3.projects 数组下只有一个项目时,它可以工作,文件被下载并存储在“/Users/Marc/GreenPool/”+ project.projectId +“/files/”下。

但是当 data3.projects 数组中有多个值时,它只保存 data3.project 之一的下载文件,而不保存其他文件:

一个有文件:

在此处输入图像描述

一个没有:

在此处输入图像描述

我们可以在第一张图片上看到其中一个文件是重复的。我认为这表明问题与这样一个事实有关,即在第一个文件夹中写入第一个文件后,它在开始写入第二个文件时仍然认为它在这个文件中(我们可以通过文件 compute2Numbers 看到它( 1).js 是重复的,因为它位于错误的文件夹中)。

控制台的日志是逻辑:

index.js:

渲染器.js:

在此处输入图像描述

在此处输入图像描述

这似乎是一个异步问题。但我已将查询包装在异步等待函数中,以防止两个下载事件相互重叠。控制台的日志显示:首先下载 data3.projects 数组中第一个值的文件,然后下载 data3.projects 数组中第二个值的文件。

那么如何才能将文件保存在正确的文件夹中呢?

0 投票
1 回答
468 浏览

javascript - ipcMain 侦听器未正确注册

在电子应用程序的主进程和渲染器进程之间的 ipc 消息存在一些问题。

ipcRenderer 正确发送消息(我可以从 devtron 看到它)但 ipcMain 没有听任何东西

main.js 中的代码

renderer.jsx 中的代码

0 投票
2 回答
1623 浏览

electron - 如何区分一个 ipc 主(同一通道)中的两个 ipc 渲染器

我想检测特定的框架/浏览器窗口。我有一个主进程和两个浏览器窗口,这三个窗口都使用相同的通道相互发送消息。在 IPCMain 我需要检测其中之一。我看到 IPCmain 事件有一个名为 frameId 的函数,但是当我使用它时,我得到了未定义。

0 投票
2 回答
3687 浏览

vue.js - 如何将不同文件中的 ipcMain.on() 函数与 main.js 分开

我正在创建一个以 vuejs 作为前端的电子应用程序。如何在与 main.js 不同的文件中创建所有 ipcMain.on() 函数。我想要一个更干净的代码结构。

该应用程序必须离线工作,因此我需要将数据存储在本地数据库中。所以当我在前端创建一个对象时,我将它与 ipcMain 一起发送到电子端。然后 Electron 可以将其写入本地数据库。

我想要这样的东西:

主.js:

ipcListeners.js:

这里的问题是只有第一个 ipcMain.on() 函数有效,但第二个,... 没有

0 投票
1 回答
921 浏览

typescript - 对 Spectron 中的 ipcMain 事件作出反应

我有一个电子应用程序,它首先启动一个启动器窗口(在渲染器进程中),它启动多个后台服务。在这些后台服务成功启动后,它会将"services-running"其发送ipcRenderer回主进程,而主进程又会通过关闭启动器窗口并启动主应用程序窗口来对该事件做出反应。该事件当然是由ipcMain.on('services-running',...)

我分别对所有处理程序进行了单元测试,所以这些都很好,现在我想集成测试通过的事件ipcMain

这就是我的集成测试目前的样子:

第一个测试工作正常。第二次测试最终会在超时后失败,虽然我可以subscribed在主窗口弹出之前在 shell 上看到,所以肯定会触发事件。

我阅读了nodeIntegration需要启用才能使用 spectron 访问完整电子 api 的文档,我所有的渲染器进程都是{nodeIntegration: true}在它们各自的webPreferences. 但是由于我对主进程感兴趣,我认为这不适用(或者至少我认为它不应该,因为主进程本身就是一个节点进程)。

所以我的主要问题是,我将如何绑定ipcMain事件并将其包含在我的断言中。另外我怎么知道启动器窗口何时关闭并且“主”窗口已打开?

作为奖励,我对 spectron api 有一些理解问题。

  1. 如果我查看isspectron.d.tselectron属性,它又是 a并且直接具有该属性。所以在我的理解中访问应该是(这是未定义的),远程来自哪里以及为什么它在.ApplicationElectron.AllElectronMainInterfaceipcMainipcMainapp.electron.ipcMainspectron.d.ts

  2. SpectronClient所有返回的方法Promise<void>。所以我必须awaitthen那些。如果我查看 javascript 示例,它们会链接客户端语句:

这在打字稿中不起作用,因为您不能Promise<void>明显地链接到...在 js 中如何工作?

0 投票
2 回答
1190 浏览

angular - 是否有将电子 6 数据发送到角度 8 组件的功能?

我需要将信息发送到角度组件以进行“自动”登录,我可以使用 IPCRederer(在组件上)和 IPCMain(在“电子”端)将组件数据发送到电子进程,但我不能以从电子到组件的相反方式使用,你能帮我吗?

PS:我想过一个套接字对话,但我认为这不是一个好习惯。

角度:

电子:

0 投票
0 回答
148 浏览

electron - Electron ipc 消息是有序的吗?

Electron 中是否有任何 ipc 消息的排序保证?如果是这样,它们是什么?

例如,在主要:

在渲染器中:

消息是否总是按顺序传递给渲染器(例如在上面的示例中 1 在 2 之前)?

如果是这样,如果消息在不同的通道上(例如,通过更改channel-achannel-b上述行之一),它们是否也总是排序?

0 投票
0 回答
205 浏览

python - spawn python进程正在重新加载电子页面

[更新]:在重新加载之前,有几分之一秒的警告 [违规] 'click' 处理程序花了 xx ms 是 showinf。(从录屏中得知)

我正在将 Electron 与 React 一起使用。为了与主进程(电子)和渲染器(反应)进行通信,我使用 ipcRederer 和 ipcMain 模块并使用钩子在网页上加载图像。

ipcMain 模块生成一个 python 进程,并将其结果(图像位置)发送回该进程,然后通过提供位置来加载由 python 脚本创建的图像

简单的数据流是:React -> Hooks -> ipcRender -> ipcMain -> spawn python process -> ipc Main -> ipcRender -> Hooks(useState)

当我执行它时,它会显示图像但立即重新加载网页。深入我发现问题是产生了python进程。那就是重新加载页面。

main.js(电子):

app.js(反应):

图变量包含来自 ipcMain 消息的返回值

0 投票
2 回答
4837 浏览

javascript - 如何在渲染器进程中使用 window.open 在电子中打开新窗口?

我有一个包装为电子应用程序的角度应用程序。现在,当我在渲染器进程中调用 Window.open 以获取内部路由时,我收到一条消息说Not allowed to load a local resource并打开一个空白窗口。我该如何解决这个问题?

preload.js

main.js

我尝试过的事情

  1. 添加了一个监听器new-window没有工作
  1. nativeWindowOpen向创建主 BrowserWindow 的主进程添加了标志。:没有工作

我不想使用这些require('electron')模块,或者nodeIntegration:true因为根据可用的在线/文档材料,它增加了安全问题。请建议!