【问题标题】:Electron - Catch when window is closed using the "x" buttonElectron - 使用“x”按钮关闭窗口时捕获
【发布时间】:2018-01-23 17:56:55
【问题描述】:

设置

BrowserWindow Events Docsclose事件是……

窗口关闭时触发

closed 事件是...

当窗口关闭时发出。

问题

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

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

那么,我该如何...

如何区分两者?

【问题讨论】:

    标签: javascript node.js electron


    【解决方案1】:

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

    win.close() 尝试关闭窗口。这与 用户手动点击窗口的关闭按钮。

    但是,您可以使用window.destroy(),它会生成稍微不同的事件

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

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

    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】:

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

      【讨论】:

      • 什么是#action-close?那是在听菜单栏中的“x”吗?或者那是 dom 中的 btn?
      • #action-close 是 dom 中元素的 id,在您的情况下,它将是 'x' 的 div 或 span
      • 你误解了我的问题。 “x”指的是窗口的关闭按钮。在 Windows 操作系统中,它是窗口右上角菜单栏中的一个红色方块。在 Mac OS 中,它是窗口左上角菜单栏中的一个红色圆圈。这些是 OS 窗口原生的,与 DOM 完全无关
      • 哦,那么您可以从电子中捕获 ''window-all-closed" 事件为app.on('window-all-closed', () => { app.quit(); });
      【解决方案3】:

      好吧:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-16
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        • 2013-04-08
        • 2012-10-29
        • 2016-12-20
        • 2021-12-09
        相关资源
        最近更新 更多