上一篇提到了提取Windows图标费了老牛鼻子的劲,截图的方式都用上了,这一点儿都不Geek啊,不行,还是得再想想办法(谁教我的不死心?)。

之前提取到的原汁原味的图标是从C:\Windows\System32这个里面的dll和exe拿到的,但是里面的图标大多都是从老早以前的系统版本里继承来的(我猜的),丑的没法用。新的图标一定也存在某个地方,只是,在哪里呢?搜索引擎暂时帮不到什么忙了,只能靠自己想办法。

首先想到的是利用工具定位到程序的UI组件。根据已有的经验判断,这样的工具一定是有的。一搜,果然,Windows SDK里有一个叫做Inspect的工具,正好之前安装过Windows SDK,天助我也。按图索骥,找到了这个Inspect并打开,的确是可以拿到UI组件的信息,然而,UI树里只显示了一个“none :图形”,详细信息里也没有任何有关图片路径的信息,徒留我在风中凌乱。此路不通,只能再另想他法。

没有继续沿着之前的思路换其他工具,而是换了一个思路。程序启动的时候总要去获取图标的数据吧,那我跟踪一下程序的进程看看能不能有所收获。祭出大杀器Process Monitor,设定好过滤规则,启动文件资源管理器(Explorer.exe)。PM抓到了大量的事件,只能从头开始慢慢看。没翻多久就看到了一处有用的信息,Explorer访问了一些形如iconcache_idx.db的文件,查了一下,的确是如文件名显示的那样是图标的缓存,但是似乎没有什么可以利用的地方,尝试了一下当成sqlite数据库打开也失败了,先不管它。继续往下翻,出现了让人眼前一亮的东西:C:\Windows\SystemResources\imageres.dll.mun。这个路径强烈的暗示我就是它了!但这个mun扩展名是个什么鬼。谷歌一下,我就知道。mun正是Windows系统下用来存放系统资源的文件!

找到了地方,接下来自然是顺风顺水。打开IconsExtract,选择好文件夹,点击start,上千个图标就到了我的碗里来了!