Electron:如何最小化渲染进程中的窗口

Posted

技术标签:

【中文标题】Electron:如何最小化渲染进程中的窗口【英文标题】:Electron: How to minimize a window from a rendered process 【发布时间】:2016-10-08 08:36:33 【问题描述】:

场景

我有一个窗口,它有一个 add task button 正在打开一个窗口。每次用户点击它,它都会打开一个窗口。我在add task window 上有一个按钮,可以将其最小化。这个最小化按钮如何实现?

代码

我可以使用下面的代码closemaximize窗口:

var winclose = function () 
    window.close();


var winmaximize = function () 
    window.moveTo(0, 0);
    window.resizeTo(screen.width, screen.height);

但是,我找不到任何可以从渲染进程中最小化窗口的函数。

请帮忙,非常感谢;

注意:

浏览器不向开发者提供最小化它们的功能。但在这里 是一个不同的场景。这里我使用的是 Electronjs 提供的铬。因此,在我们开发桌面应用程序时,一定有办法做到这一点

虚拟下载链接:download from OneDrive

【问题讨论】:

@mnwsmit 浏览器没有为开发者提供最小化它们的功能。但这是一个不同的场景。这里我使用的是 Electron js 提供的铬。因此,在我们开发桌面应用程序时,必须有办法做到这一点。 @mnwsmit 我希望你能删除重复的标签 那么,要明确一点,您想从该实例中最小化BrowserWindow 实例吗? IE。您想通过该窗口的 javascript 最小化该窗口吗? 我很抱歉不清楚。让我举个例子。我有一个窗口,它有一个 add task button 正在打开一个窗口。每次用户点击它,它都会打开一个窗口。我在add task window 上有一个按钮,可以将其最小化。如何实现这个最小化按钮? 我假设窗口是在main 进程中创建的? main 进程中是否有新创建的窗口的引用? 【参考方案1】:

您可以在相应的 BrowserWindow 实例上调用 minimize()。问题是如何最好地访问此实例,而这又取决于您打开窗口的方式以及最小化按钮的位置。从您的示例中,我认为最小化按钮实际上位于您要关闭的窗口中,在这种情况下,您可以最小化焦点窗口,因为当用户单击其中的按钮时,窗口当前应该具有焦点:

const  remote  = require('electron')
remote.BrowserWindow.getFocusedWindow().minimize();

您也可以使用BrowserWindow.fromId() 来访问相关窗口,例如,如果您想从另一个窗口最小化任务窗口。

【讨论】:

创建时如何设置这个id? 嘿,电子遥控器发生了重大变化,因此远程对象从模块 electron 移动到 @electron/remote。 Breaking changes info here 所以你现在可以通过import BrowserWindow from "@electron/remote";使用它【参考方案2】:

如果您偶然发现此线程并使用电子 vue,您可以直接在渲染器内部使用 this.$electron.remote.BrowserWindow.getFocusedWindow().minimize();

【讨论】:

this.$electron.remote 变量未在我的项目中定义,因此出现错误,例如无法获取未定义的 BrowserWindow 属性 @JigneshGothadiya 嘿,Jignesh,我对文档不是很熟悉,但我想现在他们可能已经更改了渲染器的电子 API,请查看文档。如果不是,那么你的代码很可能有其他问题,而不是这个 sn-p。【参考方案3】:

这对我有用:

const  remote  = require('electron')
remote.getCurrentWindow().minimize();

【讨论】:

【参考方案4】:

从渲染器最小化屏幕非常容易。使用远程对象,我们可以从渲染器最小化屏幕。假设您有一个在单击时触发屏幕最小化的按钮。 Bellow 是一个可以做到这一点的函数。

const handleMinimise =()=>
    remote.BrowserWindow.getFocusedWindow().minimize();

但首先你必须要求远离电子,如下所示

const electron = require("electron")
const remote = electron.remote

或如下

const  remote  = require("electron")

【讨论】:

【参考方案5】:

旧线程,但应注意远程模块被视为安全问题,不鼓励使用(请参阅here)。 它在电子 12 中也已被弃用(请参阅 here)。

相反,您可以通过 IPC 发送命令来调用最小化。

来自渲染器:

ipcRenderer.send('minimize')

主要:

ipcMain.on('minimize', () => 
  win.minimize()
  // or depending you could do: win.hide()
)

你也可以只做一个切换(在 main 中):

ipcMain.on('minimize', () => 
  win.isMinimized() ? win.restore() : win.minimize()
  // or alternatively: win.isVisible() ? win.hide() : win.show()
)

对于动态制作的窗口(如其他答案中所述,并且似乎是用例),您可以使用(代替“win”):

BrowserWindow.getFocusedWindow()

如果您有多个窗口(这是重点),这会产生切换问题,但如果您想从当前渲染器进程之外恢复特定窗口(例如通过 ID),您可以使用 BrowserWindow.getAllWindows() 并进行迭代.不知道您为什么要这样做,但为了完整起见,我将其包括在内。

【讨论】:

以上是关于Electron:如何最小化渲染进程中的窗口的主要内容,如果未能解决你的问题,请参考以下文章

在 Electron 中的两个渲染器进程之间进行通信

Electron无边框窗口(自定义最小化、最大化、关闭、可拖拽)

Electron - 限制从主进程到渲染进程的消息流

在 Electron 中的两个渲染器进程之间直接通信

如何自定义Electron应用程序的窗口标题栏?

如何在没有远程模块的情况下最大化和最小化电子窗口