实战篇:mark 一下 Electron 在 win7 的两个小坑点

2,939 阅读3分钟

版本信息:

    electron: 7.1.2

    系统:windows7

​背景:

我们打印应用在生产遇到俩问题:

  1. 用户 win7 系统非管理员权限打开我们的应用时,应用窗口呈透明状态(如下图所示),没有加载出我们的页面内容:

  2. win7 用户登录后,打开主窗口时,会发现任务栏上多了一个窗口,但 win10 没有这个问题,如果关闭了这个多余的窗口会导致我们的打印报错(如下图所示)。

定位问题并解决问题:

问题一:

我们尝试在 cmd 中运行我们的应用,发现有报错:

查了 issue 确实有这个问题存在,存在的原因可能是 gpu 问题引起的或者是提示里面的 electron 的 D3D compiler DLL 存在问题。

  • 针对 gpu 的问题,我们可以在右键设置应用属性,可以禁用 gpu 加速

那在我们 electron 项目里面怎么做?

参考:离屏渲染

我们也可以通过在 app ready 之前,运行 app.disableHardwareAcceleration() 来禁用 gpu 加速,启用 cpu 加速方式,由于我们的项目没怎么用到 WebGL和3D CSS动画,所以是适用于我们项目的。

  • 针对第二种 D3D compiler DLL 存在问题这种解决方式,网友提供的解决方式是下载新的 dll 文件替换 electron 里面对应文件来处理,但由于第一个方法已经满足了,所以就没有再尝试这个方法,有需要的可以参考这个 issue :github.com/electron/el…

问题二:

问题一解决了,我们来定位问题二,我们打印应用其实有开除了登录、激活、更新,主窗口外,我们还开了一个打印窗口,里面放需要打印的内容,然后调用打印 api 针对窗口内容进行打印,但这个打印窗口我们是隐藏起来的。我们点击打印的时候会去通知该窗口打印,按道理,正常情况,我们登录后只会看到一个窗口也就是主窗口,但这里出现了两个窗口,那这个窗口到底是哪一个窗口呢?于是我在各窗口关闭事件中做了日志的打印,看到多出来的这个窗口确实是打印窗口,那为什么我明明调用了 hide() 事件,但是并没有被隐藏起来?于是我又打了日志,看到在 win7 下,窗口的 hide 事件是 undefined,于是去查看了 api,api 确实有提供这个方法,恰好发现 issue 里面有人反馈开了 fullscreen 时在 win7 上有部分属性失效,于是看回来我们的代码,确实打印窗口我们设置了满屏,于是我把满屏去掉重跑,发现问题去掉了,而这个问题 win10 上没有发生的。

打个广告,扫码关注:拯救世界大超人,恶补知识的超人会时不时更新学习或工作内容

(本文未经本人同意禁止转载)