11.关闭窗口时隐藏到系统托盘
-- 未经授权禁止转载 --
main.js
	import { app, BrowserWindow, ipcMain, nativeTheme, Menu, shell, Tray } from "electron"
	import url from 'url'
	import path from 'path'
	import os from 'os'

	let __filename = url.fileURLToPath(import.meta.url)
	let __dirname = path.dirname(__filename)

	//创建窗口
	let mainWindow = null //声明一个名为 mainWindow 的全局变量,初始值为 null
	const createWindow = () => {
	    mainWindow = new BrowserWindow({
	        width: 1300, //设置窗口宽度(单位:像素)
	        height: 750, //设置窗口高度
	        icon: "resource/images/code.ico", //设置窗口图标
	        //autoHideMenuBar:true, //隐藏菜单栏
	        //resizable: false, //禁止调整窗口大小
	        //x:0, //x表示窗口左上角的水平坐标(单位:像素)
	        //y:0, //y表示窗口左上角的垂直坐标
	        webPreferences: { //网页偏好设置
	            nodeIntegration: true, //允许在渲染进程中直接使用 Node.js API
	            contextIsolation: true, //启用上下文隔 (提高安全性)
	            preload: path.resolve(__dirname,"resource/preload/preload.mjs"), //预加载脚本
	        }
	    })

	    //mainWindow.loadURL("https://www.dengruicode.com") //加载指定的 url
	    mainWindow.loadFile("resource/renderer/views/index.html") //加载本地 html

	    //当尝试打开新窗口时, 阻止默认行为, 在当前窗口加载 url
	    mainWindow.webContents.setWindowOpenHandler(details =>{
	        mainWindow.loadURL(details.url)
	        return { action: 'deny' } //阻止默认行为
	    })

	    //监听窗口关闭事件 [当用户点击窗口的关闭按钮时, close 事件会被触发]
	    mainWindow.on("close", event =>{
	        event.preventDefault() //阻止默认行为 [阻止关闭窗口的行为]
	        mainWindow.hide() //隐藏窗口
	    })

	    //监听窗口完全关闭事件 [当窗口被完全关闭并从内存中移除时, closed 事件会被触发]
	    mainWindow.on("closed", () => {  
	        mainWindow = null //避免内存泄漏、防止未知错误
	    })
	}

	//创建托盘
	const createTray = () => {
	    const icon = "resource/images/code.ico" //托盘图标
	    let template = [
	        {
	            label: '关于',
	            click: () => {
	                shell.openExternal('https://dengruicode.com') //打开外部链接
	            }
	        },
	        {
	            label: '打开',
	            click: () => {
	                mainWindow.show() //显示窗口
	            }
	        },
	        {
	            label: '退出',
	            click: () => {
	                mainWindow.destroy() //销毁窗口
	                app.quit()
	            }
	        }
	    ]

	    const menu = Menu.buildFromTemplate(template) //根据模板构建菜单
	    const tray = new Tray(icon)
	    tray.setContextMenu(menu) //设置菜单
	}

	//当应用准备就绪后执行
	app.whenReady().then(() => {
	    createWindow() //创建窗口
	    createTray() //创建托盘
	})