电子 - 使用“x”按钮关闭窗口时捕获

时间:2018-01-23 17:56:56

标签: javascript node.js electron

设置

查看BrowserWindow Events Docsclose事件是......

  

窗口即将关闭时发出

并且closed事件是......

  

窗口关闭时发出。

问题

当我手动关闭窗口(即单击菜单栏中的“x”)以及以编程方式关闭窗口时(即window.close()),会触发两个事件;

此窗口需要不同的处理,具体取决于我是以编程方式关闭窗口,还是手动关闭窗口(如果使用“x”则完全退出应用程序,否则执行某些操作)。

那么,我该如何...

我如何区分这两者?

3 个答案:

答案 0 :(得分:0)

IPC是您回答的解决方案。

const {app, BrowserWindow, Menu, ipcMain} = electron;

let mainApp;

app.on('ready', () => {
  mainApp = new BrowserWindow({ frame: false });
  mainApp.loadURL(url.format({
    pathname: path.join(__dirname, 'public/mainApp2.html'),
    protocol: 'file:',
    slashes: true
  }));
  mainApp.on('closed', () => {
    app.quit();
  });
});

ipcMain.on('command:close', (event, arg) => {
  app.quit();
});

点击

const {ipcRenderer} = require('electron');
let $ = require("jquery");



// Click Events
$("#action-close").click(() => {
    ipcRenderer.send("command:close");
});

答案 1 :(得分:0)

正如文档所述,您无法区分window.close()并点击X

  

win.close()尝试关闭窗口。这与a具有相同的效果   用户手动点击窗口的关闭按钮。

但是,您可以使用window.destroy()生成略有不同的事件

  

win.destroy()强制关闭窗口,卸载和beforeunload   没有为网页发布活动,也不会关闭活动   为这个窗口发射,但它保证关闭的事件将是   射出。

利用这种差异的一个简单示例如下:

const { app, BrowserWindow } = require('electron')

app.once('ready', () => {
  let win = new BrowserWindow()
  let isRegularClose = false
  setTimeout(() => {
    if (win) win.destroy()
  }, 5000)
  win.on('close', (event) => {
    isRegularClose = true
  })
  win.on('closed', (event) => {
    console.log(isRegularClose
      ? 'win closed (X)'
      : 'win destroyed (code)')
    win = null
  })
})

答案 2 :(得分:0)

好的,

    根据文档,
  1. win.destroy()等于X系统本机应用程序关闭按钮,它将始终确保触发closed事件而未触发close事件
  2. 单击X系统本机应用程序关闭按钮时,将首先触发close事件,然后触发closed事件。
  3. close事件在beforeunloadunload DOM事件之前发生

提示:

  1. 按照dosc使用closed事件摆脱BrowserWindow实例(您的主窗口或使用new BrowserWindow()创建的任何窗口)。这比垃圾收集要好。 see this here

5。在退出应用程序之前,我使用了closed事件关闭了本地数据库服务器。

So you can use it to accomplish similar step:


    mainWindow.on('closed', () => {

        shutdownDatabase();

        mainWindow = null; 
    });