| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- // electron/main.ts - Electron 主进程入口
- import { app, BrowserWindow, Menu } from 'electron'
- import * as path from 'path'
- import * as os from 'os'
- import { registerHandlers, removeHandlers } from './modules/ipc-handlers'
- import { logger } from './modules/logger'
- import { initConfig, getWindowBounds, saveWindowBounds } from './modules/config'
- import { initAutoUpdater } from './modules/updater'
- // 全局窗口实例
- let mainWindow: BrowserWindow | null = null
- // 开发环境判断
- const isDev = process.env.NODE_ENV === 'development' || !app.isPackaged
- // 根据平台获取图标路径
- function getIconPath(): string {
- const platform = os.platform()
- // 开发环境使用 public 目录,生产环境使用打包后的路径
- const basePath = isDev
- ? path.join(__dirname, '../public/icons')
- : path.join(process.resourcesPath, 'icons')
- if (platform === 'win32') {
- return path.join(basePath, 'win/icon.ico')
- } else if (platform === 'darwin') {
- return path.join(basePath, 'mac/icon.icns')
- } else {
- return path.join(basePath, 'png/256x256.png')
- }
- }
- /**
- * 创建主窗口
- */
- function createWindow(): void {
- // 获取保存的窗口位置
- const savedBounds = getWindowBounds()
- mainWindow = new BrowserWindow({
- width: savedBounds?.width ?? 1050,
- height: savedBounds?.height ?? 810,
- x: savedBounds?.x,
- y: savedBounds?.y,
- minWidth: 800,
- minHeight: 810,
- resizable: true, // 允许调整大小
- frame: false, // 无边框窗口
- titleBarStyle: 'hidden', // 隐藏标题栏
- icon: getIconPath(),
- webPreferences: {
- preload: path.join(__dirname, 'preload.js'),
- contextIsolation: true,
- nodeIntegration: false,
- sandbox: true
- }
- })
- // 开发环境加载 Vite 开发服务器
- if (isDev) {
- mainWindow.loadURL('http://localhost:5173')
- mainWindow.webContents.openDevTools({ mode: 'detach' })
- } else {
- // 生产环境加载打包后的文件
- mainWindow.loadFile(path.join(__dirname, '../dist/index.html'))
- }
- // 窗口移动或调整大小时保存位置
- mainWindow.on('moved', () => {
- if (mainWindow) {
- saveWindowBounds(mainWindow.getBounds())
- }
- })
- mainWindow.on('resized', () => {
- if (mainWindow) {
- saveWindowBounds(mainWindow.getBounds())
- }
- })
- mainWindow.on('closed', () => {
- mainWindow = null
- })
- logger.info('主窗口已创建')
- }
- /**
- * 应用初始化
- */
- async function initialize(): Promise<void> {
- // 初始化日志模块
- logger.init()
- // 写入安装日志,标记程序启动
- logger.installInfo(`========== 程序启动 ${new Date().toLocaleString()} ==========`)
- logger.info('应用启动', {
- platform: os.platform(),
- arch: os.arch(),
- nodeVersion: process.version,
- electronVersion: process.versions.electron,
- isDev
- })
- // 初始化配置
- await initConfig()
- // 注册 IPC 处理器
- registerHandlers()
- // 隐藏菜单栏
- Menu.setApplicationMenu(null)
- // 创建窗口
- createWindow()
- // 生产环境初始化自动更新
- if (!isDev && mainWindow) {
- initAutoUpdater(mainWindow)
- }
- // 注册窗口级别的 F12 快捷键切换开发者工具
- mainWindow?.webContents.on('before-input-event', (event, input) => {
- if (input.key === 'F12' && input.type === 'keyDown') {
- if (mainWindow?.webContents.isDevToolsOpened()) {
- mainWindow.webContents.closeDevTools()
- } else {
- mainWindow?.webContents.openDevTools()
- }
- event.preventDefault()
- }
- })
- }
- // 应用就绪
- app.whenReady().then(initialize)
- // 所有窗口关闭
- app.on('window-all-closed', () => {
- logger.info('所有窗口已关闭')
- if (os.platform() !== 'darwin') {
- app.quit()
- }
- })
- // macOS 激活
- app.on('activate', () => {
- if (BrowserWindow.getAllWindows().length === 0) {
- createWindow()
- }
- })
- // 应用退出前
- app.on('before-quit', () => {
- logger.info('应用即将退出')
- removeHandlers()
- logger.close()
- })
- // 未捕获的异常
- process.on('uncaughtException', (error) => {
- logger.error('未捕获的异常', error)
- })
- // 未处理的 Promise 拒绝
- process.on('unhandledRejection', (reason, promise) => {
- logger.error('未处理的 Promise 拒绝', { reason, promise: String(promise) })
- })
|