From 4b82de537427879861bae0dfb59aa4dc5cc02823 Mon Sep 17 00:00:00 2001 From: chenqiang Date: Tue, 9 Sep 2025 22:27:03 +0800 Subject: [PATCH] preload --- background/main.js | 184 ++++++++++++++++++++++++--------------------- vue.config.js | 35 +-------- 2 files changed, 99 insertions(+), 120 deletions(-) diff --git a/background/main.js b/background/main.js index ab077e9..d16f1b9 100644 --- a/background/main.js +++ b/background/main.js @@ -43,105 +43,117 @@ let mainWindow = null; async function createWindow() { console.log('开始创建应用窗口...'); - // 创建浏览器窗口 - mainWindow = new BrowserWindow({ - width: 800, - height: 600, - // 确保在Windows 7上能正常显示 - show: false, - webPreferences: { - // 使用Node.js 12兼容的路径解析方式 - preload: path.join(__dirname, '../src/preload.js'), - nodeIntegration: false, - contextIsolation: true, - } - }); + try { + // 创建浏览器窗口 + mainWindow = new BrowserWindow({ + width: 800, + height: 600, + show: false, + // 在Windows 7上使用更兼容的配置 + webPreferences: { + // 使用绝对路径确保preload.js能被找到 + preload: path.resolve(__dirname, '../src/preload.js'), + nodeIntegration: false, + contextIsolation: true, + // 为Windows 7添加额外的兼容性配置 + enableRemoteModule: false, + sandbox: false, + webSecurity: false + } + }); - // 设置隐藏菜单栏 - mainWindow.setMenu(null); + console.log('Preload path:', path.resolve(__dirname, '../src/preload.js')); - // 添加窗口准备好显示时的事件 - mainWindow.once('ready-to-show', () => { - console.log('窗口准备就绪,开始显示...'); - try { - // 在Windows 7上使用try-catch确保最大化操作不失败 + // 设置隐藏菜单栏 + mainWindow.setMenu(null); + + // 添加窗口准备好显示时的事件 + mainWindow.once('ready-to-show', () => { + console.log('窗口准备就绪,开始显示...'); try { - mainWindow.maximize(); - console.log('窗口已最大化'); - } catch (e) { - console.error('窗口最大化失败:', e); + // 在Windows 7上使用try-catch确保最大化操作不失败 + try { + mainWindow.maximize(); + console.log('窗口已最大化'); + } catch (e) { + console.error('窗口最大化失败:', e); + } + // 显示窗口 + mainWindow.show(); + console.log('窗口已显示'); + } catch (error) { + console.error('显示窗口时出错:', error); + // 作为备用方案,再次尝试显示窗口 + mainWindow.show(); } - // 显示窗口 - mainWindow.show(); - console.log('窗口已显示'); - } catch (error) { - console.error('显示窗口时出错:', error); - // 作为备用方案,再次尝试显示窗口 - mainWindow.show(); - } - }); + }); - // 添加窗口显示事件 - mainWindow.on('show', () => { - console.log('窗口已成功显示'); - }); + // 添加窗口显示事件 + mainWindow.on('show', () => { + console.log('窗口已成功显示'); + }); - // 添加webContents加载完成事件 - mainWindow.webContents.on('did-finish-load', () => { - console.log('页面加载完成'); - }); + // 添加webContents加载完成事件 + mainWindow.webContents.on('did-finish-load', () => { + console.log('页面加载完成'); + }); - // 添加窗口关闭事件监听 - 保持原有逻辑 - mainWindow.on("close", (event) => { - console.log("检测到窗口关闭事件"); + // 添加窗口关闭事件监听 - 保持原有逻辑 + mainWindow.on("close", (event) => { + console.log("检测到窗口关闭事件"); - // 阻止默认的关闭行为 - event.preventDefault(); - console.log("已阻止默认关闭行为"); + // 阻止默认的关闭行为 + event.preventDefault(); + console.log("已阻止默认关闭行为"); - // 使用同步方式显示对话框(Electron 11.5支持的方式) - try { - // 直接显示对话框并获取结果 - const response = dialog.showMessageBoxSync(mainWindow, { - type: "warning", - title: "确认关闭", - message: "确认要退出软件吗?退出后,未完成的考试将不会被保存。", - buttons: ["取消", "确认关闭"], - defaultId: 0, - cancelId: 0, - }); + // 使用同步方式显示对话框(Electron 11.5支持的方式) + try { + // 直接显示对话框并获取结果 + const response = dialog.showMessageBoxSync(mainWindow, { + type: "warning", + title: "确认关闭", + message: "确认要退出软件吗?退出后,未完成的考试将不会被保存。", + buttons: ["取消", "确认关闭"], + defaultId: 0, + cancelId: 0, + }); - console.log("用户选择了response:", response); + console.log("用户选择了response:", response); - // 检查用户选择的按钮索引 - if (response === 1) { - console.log("用户确认关闭,准备退出应用"); - // 移除所有事件监听器以防止任何干扰 - mainWindow.removeAllListeners(); - // 强制关闭窗口 - mainWindow.destroy(); - // 然后退出应用 - setTimeout(() => { - console.log("强制退出应用"); - app.quit(); - }, 100); - } else { - console.log("用户取消关闭"); + // 检查用户选择的按钮索引 + if (response === 1) { + console.log("用户确认关闭,准备退出应用"); + // 移除所有事件监听器以防止任何干扰 + mainWindow.removeAllListeners(); + // 强制关闭窗口 + mainWindow.destroy(); + // 然后退出应用 + setTimeout(() => { + console.log("强制退出应用"); + app.quit(); + }, 100); + } else { + console.log("用户取消关闭"); + } + } catch (error) { + console.error("显示对话框时出错:", error); } - } catch (error) { - console.error("显示对话框时出错:", error); - } - }); + }); - // 加载应用内容 - if (process.env.WEBPACK_DEV_SERVER_URL) { - // 开发模式加载开发服务器URL - await mainWindow.loadURL(process.env.WEBPACK_DEV_SERVER_URL); - if (!process.env.IS_TEST) mainWindow.webContents.openDevTools(); - } else { - createProtocol("app"); - // 生产模式加载本地HTML文件 - mainWindow.loadURL("app://./index.html"); + // 加载应用内容 + if (process.env.WEBPACK_DEV_SERVER_URL) { + // 开发模式加载开发服务器URL + await mainWindow.loadURL(process.env.WEBPACK_DEV_SERVER_URL); + if (!process.env.IS_TEST) mainWindow.webContents.openDevTools(); + } else { + createProtocol("app"); + // 生产模式加载本地HTML文件 + mainWindow.loadURL("app://./index.html"); + } + } catch (windowError) { + console.error('创建窗口失败:', windowError); + // 显示错误对话框 + dialog.showErrorBox('创建窗口失败', `无法创建应用窗口: ${windowError.message}`); } } diff --git a/vue.config.js b/vue.config.js index 0e24778..ade8474 100644 --- a/vue.config.js +++ b/vue.config.js @@ -12,40 +12,7 @@ module.exports = { pluginOptions: { electronBuilder: { - // 基础配置 - nodeIntegration: false, - contextIsolation: true, - preload: "src/preload.js", - mainProcessFile: "background/main.js", - lintPreloadFiles: false, - externals: ["fontkit", "pdfkit"], - - // 主进程webpack配置 - chainWebpackMainProcess: (config) => { - config.module - .rule("babel") - .test(/\.js$/) - .use("babel-loader") - .loader("babel-loader") - .options({ - presets: ["@babel/preset-env"], - plugins: [ - "@babel/plugin-proposal-optional-chaining", - "@babel/plugin-proposal-class-properties", - ], - }) - .end(); - - // 添加对mjs文件的处理 - 兼容Electron 11 - config.module - .rule("mjs") - .test(/\.mjs$/) - .include.add(/node_modules/) - .end() - .type("javascript/auto"); - }, - - // 所有构建选项都放在这里 + mainProcessFile: 'background/main.js', builderOptions: { // 应用基本信息 appId: 'com.example.exam11',