2017-01-06 1 views
0

Ich habe einen Renderer-Prozess, nennen wir es RP. Bei einem Klick öffnet sich ein Browserfenster (BW).Kann Fenster nicht schließen in Elektron

Jetzt, wenn Schließen auf BW geklickt wird, möchte ich dieses enge Ereignis in RP abfangen und es verhindern.

Ich habe festgestellt, dass das Fenster geschlossen ist, bevor das Ereignis close in RP aufgerufen wird.

Code:

bw.on("close", (e: Electron.Event) => hideWindow(e)); 
let hideWindow = (e: Electron.Event) => { 
    e.preventDefault(); 
    bw.hide(); 
    return false; 
    } 

Was mache ich falsch?

Ich bin mir bewusst, dass in bw ich vorunload verwenden kann, was funktioniert. Aber ich möchte, dass der RP kontrolliert, ob das Fenster schließt oder nicht.

Antwort

0

Es ist nicht möglich, da Prozesse, die das Browserfenster öffnen, ein Rendererprozess sind, der über electronic.remote aufgerufen wird und daher async verarbeitet wird. Aus diesem Grund wird das Fenster geschlossen, bevor das Schließen-Ereignis verarbeitet wird. Falls der Prozess, der das Browserfenster öffnet, der Hauptprozess war, dann wäre es in Ordnung.

Dies zeigt den Fall: https://github.com/CThuleHansen/windowHide Und hier ist eine längere Diskussion über die Frage: https://discuss.atom.io/t/close-event-for-window-being-fired-after-window-has-been-closed/37863/4

2

Hier ist, wie Sie die Schließung verhindern:

nach vielen Studien ich mit einer Lösung kam:

// Prevent Closing when work is running 
window.onbeforeunload = (e) => { 
    e.returnValue = false; // this will *prevent* the closing no matter what value is passed 

    if(confirm('Do you really want to close the application?')) { 
    win.destroy(); // this will bypass onbeforeunload and close the app 
    } 
}; 

in docs gefunden: event-close und destroy

+0

Muss im Renderer angewendet werden. IE. Innerhalb des html (index.html). – ryanjones