web-dev-qa-db-fra.com

Comment attraper l'événement de cliquer sur le bouton de fermeture de la fenêtre de l'application dans l'application Electron

Je souhaite attraper l'événement de cliquer sur le bouton de fermeture de la fenêtre de l'application dans l'application Electron.

J'essaie de développer l'application Electron pour Mac OSX. Je souhaite masquer la fenêtre de l'application, ne pas fermer l'application lorsqu'un utilisateur clique sur le bouton de fermeture de la fenêtre comme les autres applications Mac.

Cependant, je ne peux pas détecter si le système doit être arrêté ou s'il doit être masqué, car dans tous les cas, un événement close de browser-window est appelé lorsqu'un bouton de fermeture est cliqué, le système d'exploitation est arrêté ou l'application se termine avec la commande quit, Cmd+Q.

Existe-t-il un moyen d'attraper l'événement en cliquant sur le bouton de fermeture de la fenêtre de l'application dans l'application Electron?

Merci de votre aide.


Postscript

Pour détecter l'événement de cliquer sur un bouton de fermeture, j'ai essayé ce code

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();
    });
});

Avec ce code, l'application est masquée lorsqu'un bouton de fermeture de la fenêtre de l'application est cliqué, et l'application se termine lorsque Cmd+Q est tapé. Cependant, lorsque j'essaie d'arrêter le système d'exploitation, l'événement d'arrêt est empêché.

17
yukib

Vous pouvez l'attraper en utilisant l'événement close de l'API browser-window . Vous pouvez essayer ce qui suit pour vérifier cela ...

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"]
        });
    });
});

Mise à jour:

Pour séparer les fonctionnalités, vous pouvez procéder comme suit ...

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;
});

Le code ci-dessus utilise le before-quitgestionnaire d'événements pour gérer les événements de "fermeture" de l'application sur l'API de l'application. Les événements de "fermeture" de la fenêtre du navigateur sont toujours gérés sur l'API de la fenêtre du navigateur par mainWindow.on('close').

De plus, l'événement will-quit Est un meilleur endroit pour tester les problèmes avant la fermeture complète de l'application.

21
Josh
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 ---- ')
  });
})

Ainsi, vous pouvez attraper l'événement de fermeture

0
Rohit Goyal