如何在 Electron 应用程序中捕获单击应用程序 window 的关闭按钮的事件

How to catch the event of clicking the app window's close button in Electron app

我希望在 Electron 应用程序中捕获点击应用程序 window 的关闭按钮的事件。

我正在尝试为 Mac OSX 开发 Electron 应用程序。 我想隐藏应用程序 window,而不是像其他 Mac 应用程序一样在用户单击 window 的关闭按钮时终止应用程序。

但是,我无法检测系统是应该终止还是应该隐藏,因为在任何情况下,单击关闭按钮时都会调用 browser-windowclose 事件, OS 已关闭或使用退出命令终止应用程序,Cmd+Q

有什么方法可以捕捉到点击 Electron 应用程序 window 的关闭按钮的事件吗?

感谢您的帮助。


后记

为了检测点击关闭按钮的事件,我尝试了这段代码

var app = require('app');
var BrowserWindow = require('browser-window');
var Menu = require('menu');

var force_quit = false;

var menu = Menu.buildFromTemplate([
  {
    label: 'Sample',
    submenu: [
      {label: 'About App', selector: 'orderFrontStandardAboutPanel:'},
      {label: 'Quit', accelerator: 'CmdOrCtrl+Q', click: function() {force_quit=true; app.quit();}}
    ]
  }]);

app.on('window-all-closed', function(){
    if(process.platform != 'darwin')
        app.quit();
});

app.on('ready', function(){

    Menu.setApplicationMenu(menu);

    mainWindow = new BrowserWindow({width:800, height:600});

    mainWindow.on('close', function(e){
        if(!force_quit){
            e.preventDefault();
            mainWindow.hide();
        }
    });

    mainWindow.on('closed', function(){
        console.log("closed");
        mainWindow = null;
        app.quit();
    });

    app.on('activate-with-no-open-windows', function(){
        mainWindow.show();
    });
});

使用此代码,当单击应用 window 的关闭按钮时应用会隐藏,当键入 Cmd+Q 时应用会终止。但是,当我尝试关闭 OS 时,关闭事件被阻止了。

您可以使用 browser-window api 的 close 事件捕获它。您可以尝试以下方法来验证这一点...

var app = require('app');

var force_quit = false;

app.on('ready', function () {        
    mainWindow = new BrowserWindow({ width: 800, height: 600 });

    mainWindow.on('close', function() { //   <---- Catch close event

        // The dialog box below will open, instead of your app closing.
        require('dialog').showMessageBox({
            message: "Close button has been pressed!",
            buttons: ["OK"]
        });
    });
});

更新:

要分离功能,您可以执行以下操作...

var app = require('app');
var BrowserWindow = require('browser-window');
var Menu = require('menu');

var force_quit = false;
var menu = Menu.buildFromTemplate([
{
    label: 'Sample',
    submenu: [
        {label: 'About App', selector: 'orderFrontStandardAboutPanel:'},
        {
            label: 'Quit', 
            accelerator: 'CmdOrCtrl+Q', 
            click: function() { 
                force_quit=true; app.quit();
            }
        }
    ]
}]);

app.on('window-all-closed', function(){
    if(process.platform != 'darwin')
        app.quit();
});

app.on('ready', function(){

    Menu.setApplicationMenu(menu);

    mainWindow = new BrowserWindow({width:800, height:600});

    // Continue to handle mainWindow "close" event here
    mainWindow.on('close', function(e){
        if(!force_quit){
            e.preventDefault();
            mainWindow.hide();
        }
    });

    // You can use 'before-quit' instead of (or with) the close event
    app.on('before-quit', function (e) {
        // Handle menu-item or keyboard shortcut quit here
        if(!force_quit){
            e.preventDefault();
            mainWindow.hide();
        }
    });

    // Remove mainWindow.on('closed'), as it is redundant

    app.on('activate-with-no-open-windows', function(){
        mainWindow.show();
    });
});

// This is another place to handle events after all windows are closed
app.on('will-quit', function () {
    // This is a good place to add tests insuring the app is still
    // responsive and all windows are closed.
    console.log("will-quit");
    mainWindow = null;
});

以上代码使用before-quit event handler 来处理应用程序"close" 上的事件api。浏览器-window "close" 事件仍然在浏览器-window api 上由 mainWindow.on('close').

处理

此外,will-quit 事件更适合在应用程序完全关闭之前测试问题。

app.on('ready', ()=> {
let win = new BrowserWindow({width:800, height:600}) 
win.loadURL('file://'+__dirname+'/index.html')
win.on('closed', () => {
    console.log(' ---- Bye Bye Electron ---- ')
  });
})

这样你就可以捕捉到关闭事件