2015-09-11 17 views
15

Sto sviluppando un'applicazione desktop Windows utilizzando node.js e backbone.js. Voglio eseguire un'azione quando l'utente chiude l'app facendo clic sul pulsante Chiudi sulla barra del titolo o facendo clic con il pulsante destro del mouse sull'applicazione dalla barra delle applicazioni di Windows.Impossibile accedere alla funzione di chiusura delle finestre in Applicazione desktop utilizzando il nodo js

miei app.js sembra questo,

var app = module.exports = require('appjs'); 


app.serveFilesFrom(__dirname + '/content/assets/'); 

var menubar = app.createMenu([ { 
label : '&File', 
submenu : [ { 
    label : 'E&xit', 
    action : function() { 
     window.close(); 
    } 
},{ 
    label : 'New', 
    action : function() { 
     window.test(); 
    } 
} ] 
}, { 
label : '&Window', 
submenu : [ { 
    label : 'Fullscreen', 
    action : function(item) { 
     window.frame.fullscreen(); 
     console.log(item.label + " called."); 
    } 
}, { 
    label : 'Minimize', 
    action : function() { 
      console.log("df"); 
     window.frame.minimize(); 
    } 
}, { 
    label : 'Maximize', 
    action : function() { 
     console.log("nnnnnnlaaaaaaaaaaaaaaa"); 
     window.frame.maximize(); 
    } 
}, { 
    label : ''// separator 
}, { 
    label : 'Restore', 
    action : function() { 
     window.frame.restore(); 
    } 
} ] 
} ]); 

menubar.on('select', function(item) { 
console.log("menu item " + item.label + " clicked"); 
}); 

var trayMenu = app.createMenu([ { 
label : 'Show', 
action : function() { 
    window.frame.show(); 
}, 
}, { 
label : 'Minimize', 
action : function() { 
    window.frame.hide(); 
} 
}, { 
label : 'Exit', 
action : function() { 
    window.close(); 
} 
} ]); 

var statusIcon = app.createStatusIcon({ 
icon : './data/content/icons/32.png', 
tooltip : 'AppJS Hello World', 
menu : trayMenu 
}); 



var window = app.createWindow({ 
width : 1024,// 640 
height : 768, 
showChrome: true, 
icons : __dirname + '/content/icons' 
}); 
window.on('create', function() { 
console.log("Window Created"); 
window.frame.show(); 
window.frame.center(); 
window.frame.maximize(); 
window.frame.setMenuBar(menubar); 
}); 

window.on('ready', function() { 
console.log("Window Ready");  
window.require = require; 
window.process = process; 
window.module = module; 
//window.frame.openDevTools(); 
window.fileAssoc = process.mainModule.filename; 
//window.readMyFile(); 
function F12(e) { 
    return e.keyIdentifier === 'F12' 
} 
function Command_Option_J(e) { 
    return e.keyCode === 74 && e.metaKey && e.altKey 
} 


     });*/ 


window.addEventListener('keydown', function(e) { 
console.log("hi");  
    if (F12(e) || Command_Option_J(e)) {    
     window.frame.openDevTools(); 
    } 
    }); 
    }); 

visualizzato l'screenshot allegato. Sono in grado di eseguire azioni su funzionalità aggiunte personalizzate all'interno di "File" & "Windows".

Ma non so come catturare l'evento quando il pulsante di chiusura dell'app predefinito nella barra del titolo viene cliccato o chiuso facendo clic con il pulsante destro del mouse sull'applicazione dalla barra delle applicazioni di Windows. Per favore aiuto. enter image description here

Grazie in anticipo

+0

È questo evento che stai cercando: https://msdn.microsoft.com/en-us/library/system.windows.forms.closing(v=vs.110).aspx – LGSon

+0

Sì, il il primo è simile a quello che sto cercando. Ma non so come ottenere la chiusura della finestra evento utilizzando JavaScript (Node JS). –

risposta

5

AGGIORNATO (aggiunto un paio di righe di codice per mostrare modo corretto per l'evento al fuoco)

Si dovrebbe fare in questo modo:

var gui = require("nw.gui"); 

var win_main = gui.Window.get(); 
win_main.on('close', function() { 
    this.hide(); // Pretend to be closed already 
    alert("Closing..."); 

    // here you detect if data is saved, and if not, ask user if they want to save 

    this.close(true); // if this line executes the app closes, if not, 
         // app stays opened 
}); 

I ho provato quanto sopra e funziona perfettamente. Rileva sia i clic sul pulsante Chiudi che le scorciatoie da tastiera come "Ctrl + F4" in Windows.

Per ulteriori letture (spostato da commenti):

http://tutorialzine.com/2015/01/your-first-node-webkit-app/

https://nodesource.com/blog/node-desktop-applications

https://gist.github.com/LeCoupa/80eca2716a2b13c37cce

https://github.com/nwjs/nw.js/

https://github.com/nwjs/nw.js/wiki/window

+0

Ho provato la stessa cosa nella mia app.js precedente ma l'evento close non sta entrando in questo metodo. window.on ('close', function() { console.log ("Finestra chiusa"); }); È questo l'oggetto finestra uguale a quello che ho usato per creare la finestra ?? o qualcosa del genere. var window = gui.Window.get(); –

+0

Non posso rispondere perché non ho gli strumenti necessari per testarlo. Diciamo però che hai bisogno di node-webkit, vero? – LGSon

+0

si. Ho ... –

0

Finalmente l'ho fatto nascondendo la barra del titolo predefinita e aggiungendone una personalizzata.

Per questo, ho impostato l'attributo "showChrome" in appJs su false durante la creazione della finestra, che per impostazione predefinita è true.

La modifica del codice è

var window = app.createWindow({ 
    width : 1024,// 640 
    height : 768, 
    **showChrome: false**, 
    icons : __dirname + '/content/icons' 
    }); 

Ma quando l'attributo 'showChrome' è impostata su false barra delle applicazioni anche sarà nascosto fino a quando non minimizzare o ripristinare l'applicazione.

+0

Una cosa che mi è successa è che si può chiudere una finestra usando "Ctrl + F4" su SO Windows, che comunque non consente all'utente di salvare i propri dati ... fa lo stesso per te o puoi prendere quell'evento ? – LGSon

+0

No. Gestisce solo quando l'app viene chiusa dalla barra del titolo. –

+0

Ah, quindi se un utente chiude l'app in un modo diverso rispetto ai pulsanti personalizzati "Chiudi/Esci" non è possibile catturare quell'evento e l'utente non riceve alcun avviso per salvare il contenuto? – LGSon