import type {BrowserWindowConstructorOptions} from 'electron'; import {app, BrowserWindow, dialog} from 'electron'; import path from 'path'; import {_PATHS} from '../paths'; import {$env, isDev} from '../env'; import {createTray} from './tray'; // 获取公共窗口选项 export function getBrowserWindowOptions(options?: BrowserWindowConstructorOptions): BrowserWindowConstructorOptions { return { width: 1200, height: 800, webPreferences: { preload: path.join(_PATHS.preloadRoot, 'index.js'), nodeIntegration: false, contextIsolation: true, }, // 应用图标 icon: isDev ? _PATHS.appIcon : void 0, ...options, } } // 创建窗口 export function createBrowserWindow(options?: BrowserWindowConstructorOptions) { const win = new BrowserWindow(getBrowserWindowOptions(options)); // 代码逻辑说明: 【JHHB-13】桌面应用消息通知 if (process.platform === 'darwin') { // 仅 macOS 生效 if (app.dock) { app.dock.setIcon(path.join(_PATHS.electronRoot, './icons/mac/dock.png').replace(/[\\/]dist[\\/]/, '/')); } } // 设置窗口打开处理器 win.webContents.setWindowOpenHandler(() => { return { action: 'allow', // 覆写新窗口的选项,用于调整默认尺寸和加载preload脚本等 overrideBrowserWindowOptions: getBrowserWindowOptions(), } }); // 当 beforeunload 阻止窗口关闭时触发 win.webContents.on('will-prevent-unload', () => { const choice = dialog.showMessageBoxSync(win, { type: 'question', title: '确认关闭吗?', message: '系统可能不会保存您所做的更改。', buttons: ['关闭', '取消'], defaultId: 1, cancelId: 1, noLink: true, }); // 用户选择了关闭,直接销毁窗口 if (choice === 0) { win.destroy(); } }); return win; } // 创建主窗口、系统托盘 export function createMainWindow() { const win = createIndexWindow() // 设置系统托盘图标 createTray(win); // 主窗口尝试关闭时,默认不直接退出应用,而是隐藏到托盘 win.on('close', (event) => { event.preventDefault(); win.hide(); }); return win; } // 创建索引窗口 export function createIndexWindow() { const win = createBrowserWindow({ width: 1600, height: 1000, title: $env.VITE_GLOB_APP_TITLE!, }); // 开发环境加载Vite服务,生产加载打包文件 if (isDev) { let serverUrl = $env.VITE_DEV_SERVER_URL! as string; // 【JHHB-936】由于wps预览不能使用localhost访问,所以把localhost替换为127.0.0.1 serverUrl = serverUrl.replace('localhost', '127.0.0.1'); win.loadURL(serverUrl) // 开发环境下,自动打开调试工具 // win.webContents.openDevTools() } else { win.loadFile(path.join(_PATHS.publicRoot, 'index.html')); } return win; }