FontMod icon indicating copy to clipboard operation
FontMod copied to clipboard

exe程序无法应用Fonts文件夹的字体文件

Open allrobot opened this issue 1 year ago • 19 comments
trafficstars

OS: Windows 10 企业版 LTSC 21H2 19044.4170 EXE: Livemaker游戏

不管yaml更改了多少内容,或使用32/64位dll,并没有应用到字体修改

exe程序的根目录下有fonts文件夹,里面存放自己修改的字体文件MSPGothic-Regular.ttf,但是没有生效

exe使用MS Pゴシック字体,即MSPGothic

日志: FontMod.log

还是得安装字体才能看得到更改

怎么回事?看另一个英文issue似乎提到21H2无法应用字体修改?

allrobot avatar Mar 30 '24 12:03 allrobot

系统中已有同名字体?可能是Windows本身的限制,有同名字体时优先使用系统字体。

ysc3839 avatar Apr 01 '24 06:04 ysc3839

image

image

注册表的字体文件中并没有MSPGothic.ttf

allrobot avatar Apr 01 '24 15:04 allrobot

那我就不知道了,这个功能仅仅是调用一下系统API从文件加载字体,系统做了什么操作、遇到什么问题是无法控制的。

ysc3839 avatar Apr 02 '24 10:04 ysc3839

那我就不知道了,这个功能仅仅是调用一下系统API从文件加载字体,系统做了什么操作、遇到什么问题是无法控制的。

系统api没法优先于其它任何字体加载MSPGothic-Regular.ttf吗?

我在log看到了很多各种字体文件,猜测可能是系统没调用我的字体文件,而是先调用别的字体文件了,所以没能调用MSPGothic-Regular.ttf?

allrobot avatar Apr 03 '24 04:04 allrobot

系统API只是把字体文件添加到进程的字体列表里,不需要把字体安装到系统里。log的内容是程序加载的字体。你不是说没有同名字体吗?那怎么会先调用别的字体文件?你的配置文件是怎么写的?

ysc3839 avatar Apr 03 '24 06:04 ysc3839

系统API只是把字体文件添加到进程的字体列表里,不需要把字体安装到系统里。log的内容是程序加载的字体。你不是说没有同名字体吗?那怎么会先调用别的字体文件?你的配置文件是怎么写的?

image

image

没有更改dll创建的FontMod.yaml,使用文档说无需配置即可使用:

https://github.com/ysc3839/FontMod/blob/86f27619f0fac24f1b700eb7ce813feed08b7167/README.zh_CN.md?plain=1#L8-L12

没作用,生成的log有其它字体

fonts文件夹的字体没有生效,我就更改配置文件的fonts,删掉默认配置SimSun等的字体换成MS PGothic,但也没作用,生成的log也有其它字体 你的意思是配置文件写错了?

fonts:
  MS PGothic:
    replace: MSPGothic
    <<: *style

fonts:
  MS PGothic:
    replace: MS Pゴシック
    <<: *style

allrobot avatar Apr 03 '24 08:04 allrobot

这个项目的功能是:假设一个程序会使用 A 字体,但是我想让它用 B 字体,就可以用这个项目,原理是 hook 字体相关的 API,遇到字体名称是 A 时就改成 B。 然后可能遇到一种需求,那就是我不想把替换的 B 字体安装到系统里,所以提供了一个直接加载字体文件的功能,这个功能只是调用一下系统提供的加载字体文件的API,假如系统里已经有了这个字体,最终系统优先选择哪个字体是控制不了的。 log里看到的内容,都是程序打开过的字体,至于打开后用在了哪里,那就不知道了。 你需要确定,系统里有没有 MS PGothic 这个名称的字体,不是文件名称,是实际的字体名称。如果有的话,那可能是系统优先选择了全局安装的字体,你需要修改字体名称,然后在配置文件里配置把 MS PGothic 替换成新字体名称。

ysc3839 avatar Apr 03 '24 10:04 ysc3839

提供了一个直接加载字体文件的功能,这个功能只是调用一下系统提供的加载字体文件的API,假如系统里已经有了这个字体,最终系统优先选择哪个字体是控制不了的。 log里看到的内容,都是程序打开过的字体,至于打开后用在了哪里,那就不知道了。 你需要确定,系统里有没有 MS PGothic 这个名称的字体,不是文件名称,是实际的字体名称。如果有的话,那可能是系统优先选择了全局安装的字体,你需要修改字体名称,然后在配置文件里配置把 MS PGothic 替换成新字体名称。

系统没有安装字体啊……游戏调用的MS Pゴシック字体,如果安装MSPGothic-Regular.ttf,程序就直接显示MS Pゴシック字体

我想了想,干脆通过正则表达式批量把log的[CreateFont] name = "替换为 ", height = .*$替换为:\r\n replace: MS Pゴシック\r\n <<: \*style,然后剪切黏贴到yaml配置文件中

image

replace的MS Pゴシック换成MS PGothic@MS PGothic@MS Pゴシック(log有创建这4个字体,不知道是来自Fonts文件夹的字体文件,还是系统字体的,系统的注册表真没有这4个字体)

如果仔细观察发现游戏菜单的字体已经生效发生更改了,但是,即使更改4种字体,蓝色方框内的游戏文本并没有发生任何更改,如图所示:

22

如果安装Fonts文件夹下的字体,就能看得到蓝色方框已经显示MSPGothic-Regular.ttf里面的简体中文了,如图所示:

23

我不明白为啥log都替换了,只有程序的菜单字体发生了更改,游戏文本却没有更改

allrobot avatar Apr 03 '24 13:04 allrobot

有可能游戏是用自己的字体引擎,只是支持加载系统中的字体文件

ysc3839 avatar Apr 05 '24 21:04 ysc3839

有可能游戏是用自己的字体引擎,只是支持加载系统中的字体文件

dll没法替代游戏的字体引擎吗?所有windows10的字体引擎无非是CreatorFontIndireA这类的吧

有个Github的开源库UniversalInjectorFramework,某人修改winmm.dll能正常加载字体文件(链接:https://github.com/satan53x/SExtractor/tree/main/tools/UniversalInjectorFramework ),但只能以GBK编码输出文本,无法以程序原有的JIS编码输出

allrobot avatar Apr 06 '24 13:04 allrobot

请问这是什么游戏?能否给个完整的测试方法,我有空调查看看。

ysc3839 avatar Apr 07 '24 04:04 ysc3839

请问这是什么游戏?能否给个完整的测试方法,我有空调查看看。

https://pixeldrain.com/u/YduBrUg3

用UIF的一些测试可供参考,https://github.com/satan53x/SExtractor/issues/55

allrobot avatar Apr 07 '24 08:04 allrobot

测试了一下,似乎字体一直都没成功替换?已经安装了你给的字体,但是游戏内仍然是繁体中文,是不是成功替换后就会变成简体中文?能否提供一下能成功替换的 FontMod.yaml

ysc3839 avatar Apr 13 '24 23:04 ysc3839

测试了一下,似乎字体一直都没成功替换?已经安装了你给的字体,但是游戏内仍然是繁体中文,是不是成功替换后就会变成简体中文?能否提供一下能成功替换的 FontMod.yaml

你用的win11?

我的系统版本是win10,那个替换成功的yaml内容(菜单字体替换成功,蓝框无法应用字体):

  MS PGothic:
    replace: @MS Pゴシック
    <<: *style
  @MS PGothic:
    replace: @MS Pゴシック
    <<: *style
  MS Pゴシック:
    replace: @MS Pゴシック
    <<: *style
  @MS Pゴシック:
    replace: @MS Pゴシック
    <<: *style

win10或win7貌似安装字体就可以替换为简体中文(需要重新启动电脑)

allrobot avatar Apr 14 '24 06:04 allrobot

系统是Win10。已经安装字体并重启系统了,不管用不用FontMod都还是繁体,也试过把系统语言改成日语,仍然是繁体。

ysc3839 avatar Apr 14 '24 19:04 ysc3839

系统是Win10。已经安装字体并重启系统了,不管用不用FontMod都还是繁体,也试过把系统语言改成日语,仍然是繁体。

那可真奇怪,你比较熟悉字体引擎,需要我做什么相关记录提交给你?

如果有时间的话,可以下个Windows 10 企业版 LTSC 21H2的虚拟机,应该可以复现

LTSC企业版的激活码,CMD管理员执行:

slmgr.vbs /ipk M7XTQ-FN8P6-TTKYV-9D4CC-J462D
slmgr.vbs /skms kms.loli.beer
slmgr.vbs /ato

allrobot avatar Apr 15 '24 00:04 allrobot

不知道,也许可以确认一下是不是字体搞错了?或者是不是装了别的字体,变成简体是别的字体的效果? 我用的是Win10专业版,有空试试看LTSC情况如何。

ysc3839 avatar Apr 15 '24 04:04 ysc3839

没有,我装的就是压缩包内部的ttf字体文件

不过,其它系统无法应用字体值得推敲

Message ID: @.***>

allrobot avatar Apr 15 '24 12:04 allrobot

不知道,也许可以确认一下是不是字体搞错了?或者是不是装了别的字体,变成简体是别的字体的效果? 我用的是Win10专业版,有空试试看LTSC情况如何。

今天换了台电脑,发现无法替换字体

注册表定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts

删除MSPGothic值,然后重新启动计算机就能看到受保护的字体已被删除。

之后,安装我提供的MSPGothic-Regular.ttf,就能正常显示字体了

可能是系统已经有原有的字体了,无法用新的字体文件进行覆盖(即使提示安装成功),要等注册表删除后重新启动计算机再安装新的字体文件才能看到游戏字体的更改,微软做的win系统真不咋地,也许这是阿三编程风范吧……

allrobot avatar Jul 26 '24 18:07 allrobot