为不支持自定义字体的Electron应用替换宋体

现在有越来越多的应用开始基于 Electron 技术构建,如 Discord、Microsoft Teams,但是由于历史遗留原因,Chromium 在近期才将中文系统下网页默认字体切换为从系统中读取,之前的版本一直是使用宋体作为默认字体的,因此很多国外产品的中文字体显示都十分不理想。

其中一些软件可能不再更新,或更新周期很长,也可能开发人员拒绝为 CJK 用户做特殊优化,鉴于忍是不可能忍的,那就自己动手解决吧。

警告: 使用以下方式来替换应用的字体为系统字体将会破坏应用的数字签名,可能导致包括但不限于性能下降、安全软件误删、应用崩溃、更新失败、无法启动的问题。

前言

这个问题已经不是第一次被提出了,很多其他应用也有类似的问题,比如使用 QT 的 Telegram 客户端以及一些其他公司基于 WinForm 平台开发的应用。

之前较流行的方式有注册表替换、注入 DLL 替换等,但是如果使用前者直接替换宋体为微软雅黑,将会有很多应用的界面布局错乱以及文字无法显示,而后者仅限于 Telegram 客户端。

这两种不对应用本身做修改的方式都不适合我们当前遇到的场景:需要修改字体的应用是一个浏览器。

开始

老版本 Electron 默认使用宋体的截图

以上是修改前的情况,宋体在 100% 缩放的非 HiDPI 显示器下尚可接受,但是如果是 HiDPI 显示器,就会跟随着像素密度的升高而越来越辣眼睛。

首先要找到要修改的应用的安装路径和它的主程序,如 C:\Program\electron.exe然后使用 WinHex 等 Hex 编辑器打开主程序,并搜索 Unicode 字符串 simsum (全小写)

WinHex 中打开并定位到包含 simsun 字符串的位置的 Electron 可执行文件

如果是未经修改的 Electron 3.1.13,将会在以上偏移位置找到如上图所示的包含全小写 simsum 且前后有 ms pgothicgulim 的字符串,如果字符串包含大写,或前后内容不匹配,或是 simsun-extb,都不是我们要找的位置。

将以上位置的 Hex 内容使用 0 填充,注意不是字符串 "0",长度必须相等。

再次提醒: 继续操作将会使应用的数字签名失效,且可能导致一系列问题,请确保自己知道自己在做什么并备份文件。

如果应用仍然运行在后台,先退出应用再保存可执行文件,然后再次启动应用检查效果。

如果应用更新了自己的主程序文件,需要重新执行以上步骤。

修改后的老版本 Electron 默认使用微软雅黑的截图

以上是修改后的效果,应用将使用系统中的字体作为 sans-serif 字体,如果无效,请检查是否修改了正确的位置、是否使用了已经不再使用写死的默认字体的 Electron 版本、应用是否自行在代码中指定了宋体。

Leave a Reply

Your email address will not be published. Required fields are marked *