Electron.js如何最小化/关闭窗口到系统托盘并从托盘恢复窗口?

Miq*_*iqe 36 javascript node.js nw.js electron

我希望我的Electron.js应用程序能够存放在系统托盘上,每当用户想要做某些事情时,他们都可以从系统托盘中恢复,并将其最小化/关闭回系统托盘.我怎么做?

我已经看过tray文档中的部分但是没有太大帮助实现我想要的东西.

这是我到目前为止在main.js文件上得到的

var application = require('app'),
    BrowserWindow = require('browser-window'),
    Menu = require('menu'), 
    Tray = require('tray'); 
application.on('ready', function () {
    var mainWindow = new BrowserWindow({
        width: 650,
        height: 450,
        'min-width': 500,
        'min-height': 200,
        'accept-first-mouse': true,
        // 'title-bar-style': 'hidden',
        icon:'./icon.png'
    });
    mainWindow.loadUrl('file://' + __dirname + '/src/index.html');
    mainWindow.on('closed', function () {
        mainWindow = null;
    });
    mainWindow.setMenu(null);

    var appIcon = null;
    appIcon = new Tray('./icon-resized.png');
    var contextMenu = Menu.buildFromTemplate([
        { label: 'Restore', type: 'radio' }
    ]);
    appIcon.setToolTip('Electron.js App');
    appIcon.setContextMenu(contextMenu);
});
Run Code Online (Sandbox Code Playgroud)

更新:

我发现了这个菜单库,但它在linux上无法正常工作.

Miq*_*iqe 68

我实际上很久以前就已经知道了,但对于那些在这里遇到同样问题的人来说,有一种方法可以实现最小化tray和恢复tray.诀窍是捕捉closeminimize事件.

var BrowserWindow = require('browser-window'),

var mainWindow = new BrowserWindow({
    width: 850,
    height: 450,
    title: "TEST",
    icon:'./icon.png'
});

mainWindow.on('minimize',function(event){
    event.preventDefault();
    mainWindow.hide();
});

mainWindow.on('close', function (event) {
    if(!application.isQuiting){
        event.preventDefault();
        mainWindow.hide();
    }

    return false;
});
Run Code Online (Sandbox Code Playgroud)

并从中恢复 Tray

var contextMenu = Menu.buildFromTemplate([
    { label: 'Show App', click:  function(){
        mainWindow.show();
    } },
    { label: 'Quit', click:  function(){
        application.isQuiting = true;
        application.quit();
    } }
]);
Run Code Online (Sandbox Code Playgroud)

  • @AnandVaidya:`var {应用程序} = require('电子');` (6认同)
  • @Pier我已经在linux和windows上测试了它,它的工作原理. (3认同)
  • “申请”在这里是什么意思? (3认同)
  • 我收到错误无法设置未定义的属性'isQuiting' (3认同)
  • 有两件事,A)这可能会给电子更新器和电子构建器带来严重的错误。电子更新程序有一个名为 quitAndInstall() 的函数,正如您猜测的那样,它会在发布时退出并安装电子应用程序的更新。quitAndInstall 函数显然使用了电子的 quit() 函数,该函数在这里几乎被阻止,因此无论谁使用它,如果您不想为您的客户端发布损坏的更新,请在使用 quitAndInstall() 之前将 isQuiting 值设置为 true。 (3认同)

Jal*_*afa 11

对于那些不想改变minimize行为的人来说,这是一种比使用标志更好的方法:

通常只是close使用事件隐藏窗口mainWindow.hide()

mainWindow.on('close', function (event) {
    event.preventDefault();
    mainWindow.hide();
});
Run Code Online (Sandbox Code Playgroud)

然后调用mainWIndow.destroy()强制关闭窗口。它还保证执行closed事件处理程序。

文档

强制关闭窗口,网页不会发出 unload 和 beforeunload 事件,该窗口也不会发出 close 事件,但保证会发出 closed 事件。

var contextMenu = Menu.buildFromTemplate([
    { label: 'Show App', click:  function(){
        mainWindow.show();
    } },
    { label: 'Quit', click:  function(){
        mainWindow.destroy();
        app.quit();
    } }
]);
Run Code Online (Sandbox Code Playgroud)


Vis*_*ori 10

如果您希望始终在系统托盘上显示图标,直到您不退出应用程序,我会使用方案更新代码

var { app, BrowserWindow, Tray, Menu } = require('electron')
var path = require('path')
var url = require('url')
var iconpath = path.join(__dirname, 'user.ico') // path of y
var win
function createWindow() {
    win = new BrowserWindow({ width: 600, height: 600, icon: iconpath })

    win.loadURL(url.format({
        pathname: path.join(__dirname, 'index.html'),
    }))

    var appIcon = new Tray(iconpath)

    var contextMenu = Menu.buildFromTemplate([
        {
            label: 'Show App', click: function () {
                win.show()
            }
        },
        {
            label: 'Quit', click: function () {
                app.isQuiting = true
                app.quit()
            }
        }
    ])

    appIcon.setContextMenu(contextMenu)

    win.on('close', function (event) {
        win = null
    })

    win.on('minimize', function (event) {
        event.preventDefault()
        win.hide()
    })

    win.on('show', function () {
        appIcon.setHighlightMode('always')
    })

}

app.on('ready', createWindow)
Run Code Online (Sandbox Code Playgroud)


Art*_*iev 6

除了上述答案以外- isQuiting标记也值得在应用的before-quit回调中设置。这样,如果操作系统或用户以其他方式(例如通过Macos Dock任务栏的quit命令)请求,则可以正确关闭应用程序。完整的Typescript友好代码段:

import {app, BrowserWindow, Tray, Menu} from 'electron';
import * as path from 'path';

let window;
let isQuiting;
let tray;

app.on('before-quit', function () {
  isQuiting = true;
});

app.on('ready', () => {
  tray = new Tray(path.join(__dirname, 'tray.png'));

  tray.setContextMenu(Menu.buildFromTemplate([
    {
      label: 'Show App', click: function () {
        window.show();
      }
    },
    {
      label: 'Quit', click: function () {
        isQuiting = true;
        app.quit();
      }
    }
  ]));

  window = new BrowserWindow({
    width: 850,
    height: 450,
    show: false,
  });

  window.on('close', function (event) {
    if (!isQuiting) {
      event.preventDefault();
      window.hide();
      event.returnValue = false;
    }
  });
});
Run Code Online (Sandbox Code Playgroud)