electron+vue——区分窗口普通关闭和强制退出 - 前端

electron+vue——区分窗口普通关闭和强制退出 - 前端

preload.js:

import { contextBridge, ipcRenderer } from "electron";contextBridge.exposeInMainWorld("desktopHandler", {onWindowClose: (callback) => ipcRenderer.on("window-close", (event, closeType) => {callback({ type: closeType }); // 'normal' 或 'force' <==关键
  }),confirmClose: () => ipcRenderer.send("confirm-window-close"),
});

js:

import { app, protocol, BrowserWindow, Menu, shell, ipcMain } from "electron";

let mainWindow = null;
...
function createWindow() {// 创建浏览器窗口mainWindow = new BrowserWindow({width: 1000,height: 600,webPreferences: {nodeIntegration: true, // 是否启用 Node.js 集成contextIsolation: true, // 是否启用上下文隔离,启用时,需通过preload.js安全暴露 ipcRendererpreload: path.join(__dirname, "preload.js"),},});// 监听窗口关闭事件mainWindow.on("close", (e) => {e.preventDefault(); // 先阻止默认关闭行为mainWindow.webContents.send("window-close"); // 发送事件到渲染进程 }); }... // 主进程准备完毕 app.on("ready", async () => {// 接收渲染进程的确认关闭消息ipcMain.on("confirm-window-close", () => {mainWindow.destroy(); // 真正关闭窗口mainWindow = null;});createWindow(); }); ...

App.vue:

...
mounted() {const { desktopHandler } = window;if (desktopHandler) {desktopHandler.onWindowClose((closeEvent) => {// 普通关闭if (closeEvent.type === "normal") {// 打开确认弹窗之类的操作} else {// 强制退出setTimeout(() => desktopHandler.confirmClose(), 1000);}});}},
..