2015-09-11 17 views
15

Zajmuję się tworzeniem aplikacji pulpitu systemu Windows przy użyciu plików node.js i backbone.js. Chcę wykonać akcję, gdy użytkownik zamknie aplikację, klikając przycisk zamknięcia na pasku tytułu lub klikając prawym przyciskiem myszy aplikację na pasku zadań systemu Windows.Nie można uzyskać dostępu do funkcji zamykania okna w aplikacji na pulpicie przy użyciu węzła js

Moi app.js wygląda tak,

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

Proszę znaleźć załączony zrzut ekranu. Jestem w stanie wykonywać akcje na niestandardowych funkcjach dodanych w "File" & "Windows".

Ale nie wiem, jak uchwycić zdarzenie po kliknięciu lub zamknięciu domyślnego przycisku zamknięcia aplikacji na pasku tytułu, klikając prawym przyciskiem myszy aplikację na pasku zadań systemu Windows. Proszę pomóż. enter image description here

Dzięki z góry

+0

Czy to wydarzenie, którego szukasz: https://msdn.microsoft.com/en-us/library/system.windows.forms.form.closing(v=vs.110).aspx – LGSon

+0

Tak, pierwszy jest podobny do tego, czego szukam. Ale nie wiem, jak uzyskać zamknięcie okna zdarzenia za pomocą JavaScript (Węzeł JS). –

Odpowiedz

5

AKTUALIZACJA (dodał jeszcze kilka linii kodu, aby pokazać właściwą drogę do zdarzenia na ogień)

należy zrobić tak:

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 wypróbowałem powyższe i działa idealnie. Łapie zarówno kliknięcia "Zamknij" i skróty klawiszowe, takie jak "Ctrl + F4" w systemie Windows.

Dalsze odczytu (przeniesione z uwagi):

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

Próbowałem tego samego w powyższym app.js Ale zdarzenie close nie wprowadza tej metody. window.on ('close', function() { console.log ("Window close"); }); Czy jest to obiekt okna taki sam jak ten, którego użyłem do utworzenia okna ?? lub coś takiego. var window = gui.Window.get(); –

+0

Nie mogę odpowiedzieć, ponieważ nie mam niezbędnych narzędzi do przetestowania go. Mówi się jednak, że potrzebujesz webkita na węźle, prawda? – LGSon

+0

tak. Mam ... –

0

W końcu zrobiłem to ukrywając domyślny pasek tytułu i dodając niestandardowy.

W tym celu ustawiam atrybut "showChrome" w appJs na false podczas tworzenia okna, który jest domyślnie prawdziwy.

Zmiana kodu jest

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

Ale kiedy Atrybut „showChrome” jest ustawiona na false pasku zadań będzie również ukryte dopóki my zminimalizować lub przywrócić aplikację.

+0

Jedną rzeczą, która mi się przydarzyła, było to, że można zamknąć okno za pomocą "Ctrl + F4" na systemie operacyjnym Windows, które nadal nie daje użytkownikowi możliwości zapisania danych ... czy to samo dzieje się dla ciebie, czy możesz złapać to wydarzenie ? – LGSon

+0

Nie. Obsługuje tylko, gdy aplikacja jest zamknięta z paska tytułu. –

+0

Ah, więc jeśli użytkownik zamknie aplikację w inny sposób niż za pomocą niestandardowych przycisków "zamknij/wyjdź", nie będzie możliwe złapanie tego zdarzenia, a użytkownik nie otrzyma ostrzeżenia dotyczącego zapisania zawartości? – LGSon