You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,会放大这个时序问题的触发概率。

修复方案

  1. 等子窗口内容完全加载完成后再调用打印方法,不要在did-create-window触发时立刻执行打印
  2. 给print方法传入回调函数捕获打印错误,避免未捕获异常直接杀进程
  3. 打印流程结束后主动关闭临时创建的子窗口,避免残留窗口对象

修改后主进程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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 02:18:14