无法使用节点 js 访问桌面应用程序中的窗口关闭功能

Posted

技术标签:

【中文标题】无法使用节点 js 访问桌面应用程序中的窗口关闭功能【英文标题】:Cannot access window close function in Desktop Application using node js 【发布时间】:2015-12-07 17:19:59 【问题描述】:

我正在使用node.js 和backbone.js 开发一个Windows 桌面应用程序。 当用户通过单击标题栏上的关闭按钮或右键单击 Windows 任务栏中的应用程序来关闭应用程序时,我想执行一个操作。

我的 app.js 看起来像这样,

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

请查看随附的屏幕截图。我能够对“文件”和“Windows”中的自定义添加功能执行操作。

但我不知道如何在标题栏中的默认应用程序关闭按钮被单击或通过右键单击 Windows 任务栏中的应用程序关闭时捕获事件。请帮忙。

提前致谢

【问题讨论】:

你要找的是这个活动吗:msdn.microsoft.com/en-us/library/… 是的,第一个与我正在寻找的相似。但我不知道如何使用 javascript(Node JS) 获取窗口关闭事件。 【参考方案1】:

更新(添加了更多代码行以显示事件触发的正确方式)

你应该这样做:

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

我尝试了上述方法,效果很好。它可以同时捕获“关闭按钮”点击和 Windows 中的“Ctrl+F4”等快捷键。

进一步阅读(从 cmets 移出):

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

【讨论】:

我在上面的app.js中也试过了,但是close事件没有进入这个方法。 window.on('close', function() console.log("窗口关闭"); );这是我用来创建窗口的窗口对象吗?或类似的东西。 var window = gui.Window.get(); 无法回答这个问题,因为我没有必要的工具来测试它。它确实说,你需要 node-webkit,对吗? 在阅读this 之后,可能是在单击标题栏关闭按钮时,该事件不会被触发(检查应用部分)。几年前我有一个类似的问题,并通过隐藏主窗口解决了这个问题,创建一个新的子窗口,它充当“主”,当那个窗口关闭时,隐藏的主窗口捕获了子窗口的关闭事件。希望这种帮助或其他方式是打开一个无框窗口并在 DOM 本身内创建该功能。 非常感谢您的帮助。我会试试你说的,明天会更新:) ... 很抱歉我的项目目前是一个appjs项目。是否需要使用 NW.js 来实现?【参考方案2】:

最后我通过隐藏默认标题栏并添加自定义标题栏来做到这一点。

为此,我在创建窗口时将 appJs 中的“showChrome”属性设置为 false,默认为 true。

代码变化是

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

但是当 'showChrome' 属性设置为 false 时,任务栏也将被隐藏,直到我们最小化或恢复应用程序。

【讨论】:

发生在我身上的一件事是,人们可以在 Windows 操作系统上使用“Ctrl+F4”关闭一个窗口,这仍然让用户没有机会保存他们的数据......你或你能赶上那个事件吗? 没有。它仅在应用程序从标题栏关闭时处理。 啊,所以如果用户以任何其他方式关闭应用程序,而不是通过您的自定义“关闭/退出”按钮,您将无法捕捉到该事件并且用户不会收到保存内容的警告? 是的.. 完全正确.. 没有任何办法来处理这个问题。这就是为什么我最终得到了部分修复。 好的,您是否尝试过“nw.js”方法,或者它现在给您带来了太多的工作量?

以上是关于无法使用节点 js 访问桌面应用程序中的窗口关闭功能的主要内容,如果未能解决你的问题,请参考以下文章

Electron | Electron中打开和关闭子窗口以及子窗口向父窗口传值

关闭窗口后页面无法点击

尝试访问节点 js 中的 req.user 属性时无法读取未定义的属性“用户名”

快速访问的内容出现在了桌面上如何去掉?

Java错误:创建新的链表节点时无法访问语句[关闭]

更改页面后关闭标签窗口浏览器