This commit is contained in:
chenqiang 2025-09-09 22:27:03 +08:00
parent ee3ee77e31
commit 4b82de5374
2 changed files with 99 additions and 120 deletions

View File

@ -43,105 +43,117 @@ let mainWindow = null;
async function createWindow() { async function createWindow() {
console.log('开始创建应用窗口...'); console.log('开始创建应用窗口...');
// 创建浏览器窗口 try {
mainWindow = new BrowserWindow({ // 创建浏览器窗口
width: 800, mainWindow = new BrowserWindow({
height: 600, width: 800,
// 确保在Windows 7上能正常显示 height: 600,
show: false, show: false,
webPreferences: { // 在Windows 7上使用更兼容的配置
// 使用Node.js 12兼容的路径解析方式 webPreferences: {
preload: path.join(__dirname, '../src/preload.js'), // 使用绝对路径确保preload.js能被找到
nodeIntegration: false, preload: path.resolve(__dirname, '../src/preload.js'),
contextIsolation: true, nodeIntegration: false,
} contextIsolation: true,
}); // 为Windows 7添加额外的兼容性配置
enableRemoteModule: false,
sandbox: false,
webSecurity: false
}
});
// 设置隐藏菜单栏 console.log('Preload path:', path.resolve(__dirname, '../src/preload.js'));
mainWindow.setMenu(null);
// 添加窗口准备好显示时的事件 // 设置隐藏菜单栏
mainWindow.once('ready-to-show', () => { mainWindow.setMenu(null);
console.log('窗口准备就绪,开始显示...');
try { // 添加窗口准备好显示时的事件
// 在Windows 7上使用try-catch确保最大化操作不失败 mainWindow.once('ready-to-show', () => {
console.log('窗口准备就绪,开始显示...');
try { try {
mainWindow.maximize(); // 在Windows 7上使用try-catch确保最大化操作不失败
console.log('窗口已最大化'); try {
} catch (e) { mainWindow.maximize();
console.error('窗口最大化失败:', e); 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', () => { mainWindow.on('show', () => {
console.log('窗口已成功显示'); console.log('窗口已成功显示');
}); });
// 添加webContents加载完成事件 // 添加webContents加载完成事件
mainWindow.webContents.on('did-finish-load', () => { mainWindow.webContents.on('did-finish-load', () => {
console.log('页面加载完成'); console.log('页面加载完成');
}); });
// 添加窗口关闭事件监听 - 保持原有逻辑 // 添加窗口关闭事件监听 - 保持原有逻辑
mainWindow.on("close", (event) => { mainWindow.on("close", (event) => {
console.log("检测到窗口关闭事件"); console.log("检测到窗口关闭事件");
// 阻止默认的关闭行为 // 阻止默认的关闭行为
event.preventDefault(); event.preventDefault();
console.log("已阻止默认关闭行为"); console.log("已阻止默认关闭行为");
// 使用同步方式显示对话框Electron 11.5支持的方式) // 使用同步方式显示对话框Electron 11.5支持的方式)
try { try {
// 直接显示对话框并获取结果 // 直接显示对话框并获取结果
const response = dialog.showMessageBoxSync(mainWindow, { const response = dialog.showMessageBoxSync(mainWindow, {
type: "warning", type: "warning",
title: "确认关闭", title: "确认关闭",
message: "确认要退出软件吗?退出后,未完成的考试将不会被保存。", message: "确认要退出软件吗?退出后,未完成的考试将不会被保存。",
buttons: ["取消", "确认关闭"], buttons: ["取消", "确认关闭"],
defaultId: 0, defaultId: 0,
cancelId: 0, cancelId: 0,
}); });
console.log("用户选择了response:", response); console.log("用户选择了response:", response);
// 检查用户选择的按钮索引 // 检查用户选择的按钮索引
if (response === 1) { if (response === 1) {
console.log("用户确认关闭,准备退出应用"); console.log("用户确认关闭,准备退出应用");
// 移除所有事件监听器以防止任何干扰 // 移除所有事件监听器以防止任何干扰
mainWindow.removeAllListeners(); mainWindow.removeAllListeners();
// 强制关闭窗口 // 强制关闭窗口
mainWindow.destroy(); mainWindow.destroy();
// 然后退出应用 // 然后退出应用
setTimeout(() => { setTimeout(() => {
console.log("强制退出应用"); console.log("强制退出应用");
app.quit(); app.quit();
}, 100); }, 100);
} else { } else {
console.log("用户取消关闭"); console.log("用户取消关闭");
}
} catch (error) {
console.error("显示对话框时出错:", error);
} }
} catch (error) { });
console.error("显示对话框时出错:", error);
}
});
// 加载应用内容 // 加载应用内容
if (process.env.WEBPACK_DEV_SERVER_URL) { if (process.env.WEBPACK_DEV_SERVER_URL) {
// 开发模式加载开发服务器URL // 开发模式加载开发服务器URL
await mainWindow.loadURL(process.env.WEBPACK_DEV_SERVER_URL); await mainWindow.loadURL(process.env.WEBPACK_DEV_SERVER_URL);
if (!process.env.IS_TEST) mainWindow.webContents.openDevTools(); if (!process.env.IS_TEST) mainWindow.webContents.openDevTools();
} else { } else {
createProtocol("app"); createProtocol("app");
// 生产模式加载本地HTML文件 // 生产模式加载本地HTML文件
mainWindow.loadURL("app://./index.html"); mainWindow.loadURL("app://./index.html");
}
} catch (windowError) {
console.error('创建窗口失败:', windowError);
// 显示错误对话框
dialog.showErrorBox('创建窗口失败', `无法创建应用窗口: ${windowError.message}`);
} }
} }

View File

@ -12,40 +12,7 @@ module.exports = {
pluginOptions: { pluginOptions: {
electronBuilder: { electronBuilder: {
// 基础配置 mainProcessFile: 'background/main.js',
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");
},
// 所有构建选项都放在这里
builderOptions: { builderOptions: {
// 应用基本信息 // 应用基本信息
appId: 'com.example.exam11', appId: 'com.example.exam11',