Win11下Electron应用调用打印命令后立即闪退问题排查
Electron点击打印按钮触发应用闪退问题
项目背景
开发点击指定按钮即可触发打印功能的Electron桌面端应用,核心实现代码如下:
main.js
const {app,BrowserWindow} = require('electron'); function createWindow(){ const win = new BrowserWindow({ resizable:false }) win.maximize() win.removeMenu() win.loadFile("./index.html") win.webContents.on('did-create-window',(window,detail)=>{ window.removeMenu() window.resizable = false window.webContents.print({silent:false}) }) } app.whenReady().then(() => { createWindow() app.on('activate', () => { if (BrowserWindow.getAllWindows().length === 0) { createWindow() } }) }) app.on('window-all-closed', () => { if (process.platform !== 'darwin') { app.quit() } })
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> whatever <button onclick="newPrint()">BIGGIE</button> </body> <script> function newPrint(){ var myWindow = window.open("", "MsgWindow", "width=200,height=100"); myWindow.document.write("<p>This is 'MsgWindow'. I am 200px wide and 100px tall!</p>"); } </script> </html>
package.json
{ "name": "electron-print", "version": "1.0.0", "description": "", "main": "main.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "dependencies": { "electron": "^19.0.2" } }
问题截图

问题现象
- 点击页面上的打印按钮后,Electron应用会直接突然关闭,暂未定位到问题成因
- 已在其他电脑上复现运行该项目(故障设备运行Win11系统,最初怀疑是系统版本问题),其他设备上项目可正常运行
- 核心疑问:该问题是否是因为Electron暂未完全兼容Win11系统导致?
问题解答
该问题不是Win11系统兼容性问题,核心原因是代码存在时序漏洞,在部分环境下会触发未捕获异常导致进程崩溃,具体如下:
根因分析
did-create-window事件的触发时机早于子窗口webContents完成初始化、页面内容加载完成的时机。你在事件回调中立刻调用window.webContents.print(),在事件循环调度顺序不同、性能表现有差异的设备上可能侥幸运行正常,但在部分Win11环境下,此时webContents实例尚未完全就绪,调用print方法会触发底层空指针访问错误,且你没有给print方法传入错误回调捕获异常,未捕获的错误会直接导致整个Electron进程退出,表现为应用闪退。
另外你使用的Electron 19.x版本本身存在数个Win11环境下窗口操作相关的已知崩溃bug,会放大这个时序问题的触发概率。
修复方案
- 等子窗口内容完全加载完成后再调用打印方法,不要在
did-create-window触发时立刻执行打印 - 给print方法传入回调函数捕获打印错误,避免未捕获异常直接杀进程
- 打印流程结束后主动关闭临时创建的子窗口,避免残留窗口对象
修改后主进程did-create-window部分代码如下:
win.webContents.on('did-create-window',(window,detail)=>{ window.removeMenu() window.resizable = false // 等待子窗口页面加载完成再触发打印 window.webContents.on('did-finish-load', () => { window.webContents.print({silent:false}, (success, errorType) => { // 捕获打印过程中的异常 if (!success) console.log('打印异常:', errorType) // 打印完成/取消后关闭临时子窗口 window.close() }) }) })
如果修改后仍然偶发闪退,可以将Electron版本升级至20.x及以上的长期支持版本,修复已知的Win11环境崩溃问题。
内容的提问来源于stack exchange,提问作者ChangNoi997
相关产品推荐
相关产品推荐

