首先Google了一下,发现网上广为流传了几个所谓完美的中文字体修改方法都是很烂的垃圾。无非是修改msgsres.dll,把几个主要字体:比如联系人列表的字体、对话窗口标题栏字体什么的强制修改成9pt。这样修改的后果当然只会是只有这些字体变成了9pt,此外其他字体依然是老样子(比如主界面自己的昵称和状态什么的)。完全是治标不治本的烂方法,猪哥不屑之( ̄^ ̄)。
既然要做,就要做得彻底点。必须仔细观察一下msgsres.dll的界面XML资源里面到底是怎样引用字体的。可以注意到主要都是这样的形式:
FontSize:rcint(49615)pt;
FontSize:rcint(20102)pt;
基本上使用这两种形式的字体占据了界面Element的绝大多数。另外也有少数几个地方是使用更小的一些7pt之类字体的,但是这类字体多是用于显示很小的比如连接状态什么的,不会出现中文所以无需修改(因为我用的是英文版(^▽^))。
那么很明显了,只要找到49615和20102这两个RC String就可以一下子把所有的小字体(目测应该是8pt)改大(一般用9pt)。修改两个字串就改了一大片小字体的Element,这点修改是合算而且彻底的。MSN Messenger所有的这类String资源都存放在msgslang.8.1.0178.00.dll(注意后面的是版本号,随着版本的不同而变化)里面。
用ResHack之类的资源修改软件打开msgslang.8.1.0178.00.dll,找到那两个麻烦的字串:
- String Table 1257-1033当中20102号String
- String Table 3101-1033当中49615号String
可以看见两个String果然都是8,只要改成9就万事大吉了。刚开始我是直接在ResHack里面修改成9,然后Compile。结果MSN这厮报错说msgslang这个dll非法。看来加了校验(─.─||)。老天保佑千万别是在末尾加了CRC校验之类的,那可就没辙了。使用二进制比较工具比较了一下放心了:MSN居然是采用在空白处插入“PADDING”这个字符串的方式来进行所谓的“校验”(哇哈哈,看来MS有的时候方法也是很傻的么),而ResHack编译后自然把这些没用的PADDING扔掉了,被MSN发现了。
要绕过这个校验也很容易:俺手工修改2进制文件不用ResHack不就得了。用UE打开msgslang.8.1.0178.00.dll,修改偏移0x1798b4和0x18a4f0两个位置上的0×38为0×39(注意要是你用的MSN版本不同或者语言不同,偏移可能不一样。但是不会差太远,实际上这里就是上面20102和49615两个String的位置。只要对比着ResHack里面的内容和UE的ASCII显示部分前后找找就能很快找到的),存盘,OK。
下次启动Windows Live Messenger之后,界面字体就变成9pt了,中文都显示正常了:
主界面(注意自己的昵称、状态和联系人的中文显示):

联系人信息(同样注意昵称和状态的中文显示):

聊天窗口(注意标题和联系人状态信息的中文显示):

完美!中文不再是小小的一团变形的丑样子了。


2007.02.23 at 1:29 am
按照你的办法,我用exescope修改了里面的字体大小,然后保存就成功了,没有出现resource hack那样的问题啊。
2007.02.23 at 4:24 am
exescope和ResHack对资源的解析能力有所不同。一般编辑String Table用Exescope是会方便点。但是Exescope总体上不如ResHack好用。
2007.03.03 at 8:03 am
请问博主可否允许我将这篇文章转载到我的blog上。谢谢!
2007.03.12 at 2:16 am
猪哥,请教个问题,为什么我的主界面每个联系人的图片都不显示,一定要点击打开到对话框状态下才能看到图片。
2007.06.29 at 8:41 am
这种修改方法挺有用的…不过还有一个很烦人的问题,就是聊天窗口内容的字体大小,每次设置后不能保存,默认是10pt的,改成9pt后再次打开聊天窗口又变回10pt…..字体却可以保存,就是字号不可以……猪哥对这个有办法解决吗?
2007.09.29 at 3:28 am
不错不错,我被这个问题困扰了好些天了.我把你的文章转到我的blog了,不过注明了来源.
2007.10.12 at 3:33 am
谢谢拉,这篇教程我转载一下~ ^.^
2008.12.01 at 3:33 am
谢谢,我在8.5版测试了可用。正纳闷英文版的中文字体太小。