windows应用程序icon缓存、查看图标、icon制作方法

本文为作者原创,转载请注明出处:https://www.cnblogs.com/zhaoqingqing/p/17610239.html



windows程序图标缓存#

在vs中替换c++程序的图标后,需要重新编译,但是很多情况下都不会刷新,还是看到老的图标,只能重启电脑才能看到新的图标。

通过ChatGPT得到相关的回答如下:

如果在 Windows 上更换了可执行文件 (.exe) 的图标,但是在图标文件已经更改的情况下仍然显示旧的图标,可能是因为 Windows 缓存了旧的图标。为了解决这个问题,可以尝试以下步骤:

  1. 从可执行文件的图标属性中删除图标,保存并关闭。

  2. 重新打开文件的属性对话框,选择 "更改图标"。

  3. 选择一个新的图标并保存更改。

  4. 如果图标仍然没有更改,请尝试重启 Windows Explorer 进程。可以在任务管理器中找到 "Windows Explorer" 进程,右键单击并选择 "重启"。

  5. 如果问题仍然存在,尝试清除 Windows 图标缓存。可以按照上一个问题中提到的步骤进行操作。 一般情况下,以上步骤应该可以解决更换图标后仍然显示旧图标的问题。

但是以上方法都相对比较麻烦,那么有没有更好的方法来确认图标是否更换成功呢?


IconViewer#

下载地址:Download IconViewer - MajorGeeks


使用方法#

下载安装后,需要重启电脑才能生效,注意一定要重启电脑才能生效。

选择exe - 鼠标右键 - 属性 - 会增加一栏 icon,显示exe的图标。

image-20230731110516755


icon制作方法#

windows应用程序的图标文件制作

原理:把不同尺寸的png合在一个ico文件中

下载Greenfish Icon Editor Pro 4.2,与老版本的操作方式类似,有多个图层,注意不同的尺寸只需要一个图层即可。

可以保存工程为模版,下次从模版中修改即可。


python脚本提取icon#

从网上找到一段python脚本提取exe程序的图标,python2与3理论上都可以使用。

Copy
# -*- coding: GB18030 -*- import os import sys import string import pefile import hashlib import struct def get_ico(argv_dic, group_dic): totalData, lastData, lastIconId = '', None, -1 if group_dic[0]: resIcons = filter(lambda x: x.id==pefile.RESOURCE_TYPE['RT_ICON'], argv_dic['peobj'].DIRECTORY_ENTRY_RESOURCE.entries) idCount = struct.unpack('H', group_dic[0][4:6])[0] iconIds = set([struct.unpack('H', group_dic[0][i*14+18:i*14+20])[0] for i in xrange(idCount)]) iconIdMap = dict([(struct.unpack('H', group_dic[0][i*14+18:i*14+20])[0], i) for i in xrange(idCount)]) for resIcon in resIcons: if resIcon and hasattr(resIcon, 'directory'): for resId in resIcon.directory.entries: if resId.id in iconIds: lastIconId = resId.id if hasattr(resId, 'directory'): for resLang in resId.directory.entries: lastData = argv_dic['peobj'].get_data(resLang.data.struct.OffsetToData, resLang.data.struct.Size) if iconIdMap.has_key(resId.id) == False: continue iconIdx = iconIdMap[resId.id] iconHeader = '\x00\x00\x01\x00\x01\x00' + group_dic[0][6 + iconIdx * 14:6 + iconIdx * 14 + 12] + '\x16\x00\x00\x00' lastData = iconHeader + lastData totalData = totalData + lastData else: lastData = argv_dic['peobj'].get_data(resId.data.struct.OffsetToData, resId.data.struct.Size) iconIdx = iconIdMap[resId.id] iconHeader = '\x00\x00\x01\x00\x01\x00' + group_dic[0][6 + iconIdx * 14:6 + iconIdx * 14 + 12] + '\x16\x00\x00\x00' lastData = iconHeader + lastData totalData = totalData + lastData md5obj = hashlib.md5() md5obj.update(totalData) path_filter = os.path.join(argv_dic['outdir'], md5obj.hexdigest()) if os.path.exists(path_filter) == False: os.mkdir(path_filter) if argv_dic['if_makeico'] != 0: os.mkdir(os.path.join(path_filter, "ico")) for resIcon in resIcons: if resIcon and hasattr(resIcon, 'directory'): for resId in resIcon.directory.entries: if resId.id in iconIds: lastIconId = resId.id if hasattr(resId, 'directory'): for resLang in resId.directory.entries: lastData = argv_dic['peobj'].get_data(resLang.data.struct.OffsetToData, resLang.data.struct.Size) if iconIdMap.has_key(resId.id) == False: continue iconIdx = iconIdMap[resId.id] iconHeader = '\x00\x00\x01\x00\x01\x00' + group_dic[0][6 + iconIdx * 14:6 + iconIdx * 14 + 12] + '\x16\x00\x00\x00' lastData = iconHeader + lastData md5obj = hashlib.md5() md5obj.update(lastData[22:]) file_ico = open(os.path.join(path_filter, "ico", md5obj.hexdigest() + ".ico"), "wb+") file_ico.write(lastData) file_ico.close() print("hash.md5(pe.resources[i].offset, pe.resources[i].length) == \""+md5obj.hexdigest()+ "\" or") else: lastData = argv_dic['peobj'].get_data(resId.data.struct.OffsetToData, resId.data.struct.Size) iconIdx = iconIdMap[resId.id] iconHeader = '\x00\x00\x01\x00\x01\x00' + group_dic[0][6 + iconIdx * 14:6 + iconIdx * 14 + 12] + '\x16\x00\x00\x00' lastData = iconHeader + lastData file_ico = open(os.path.join(path_filter, "ico", md5obj.hexdigest() + ".ico"), "wb+") file_ico.write(lastData) file_ico.close() print("hash.md5(pe.resources[i].offset, pe.resources[i].length) == \""+md5obj.hexdigest()+ "\" or") argv_dic['peobj'].close() os.rename(argv_dic['path_sample'], os.path.join(path_filter, os.path.basename(argv_dic['path_sample']) + ".exe")) return True argv_dic['peobj'].close() def scan_ico(path_sample, outdir, if_makeico): peobj = pefile.PE(path_sample) group_dic = {} if hasattr(peobj, 'DIRECTORY_ENTRY_RESOURCE'): resGroupIcon = filter(lambda x: x.id==pefile.RESOURCE_TYPE['RT_GROUP_ICON'], peobj.DIRECTORY_ENTRY_RESOURCE.entries) if len(resGroupIcon) > 0: for i in range(len(resGroupIcon)): resGroupIcon = resGroupIcon[i] if hasattr(resGroupIcon, 'directory'): for resId in resGroupIcon.directory.entries: if hasattr(resId, 'directory'): for resLang in resId.directory.entries: group_dic[0] = peobj.get_data(resLang.data.struct.OffsetToData, resLang.data.struct.Size) return get_ico({'peobj':peobj, 'outdir':outdir, 'path_sample':path_sample, 'if_makeico':if_makeico}, group_dic) else: group_dic[0] = peobj.get_data(resId.data.struct.OffsetToData, resId.data.struct.Size) return get_ico({'peobj':peobj, 'outdir':outdir, 'path_sample':path_sample, 'if_makeico':if_makeico}, group_dic) else: peobj.close() else: peobj.close() else: peobj.close() def plan(): #这里你可传参,我先帮你写死了 if len(sys.argv) > 1: path_sample = sys.argv[1] if len(sys.argv) > 2: outdir = sys.argv[2] if len(sys.argv) > 3: if_makeico = int(sys.argv[3]) if_sucess = False try: path_sample = r"D:\xx\xx.exe"#也可以指定一个完整的路径 outdir = "./" if_makeico = 1 if_sucess = scan_ico(path_sample, outdir, if_makeico) except Exception,e: if str(e).find("Error") != -1: print path_sample + " scan ico failed." return if if_sucess != True: os.rename(path_sample, os.path.join(outdir, "no_find_ico", os.path.basename(path_sample) + ".exe")) if __name__ == '__main__': plan() #任务开始

作者:赵青青   一名在【网易游戏】做游戏开发的程序员,擅长Unity3D,游戏开发,.NET等领域。
本文版权归作者和博客园共有,欢迎转载,转载之后请务必在文章明显位置标出原文链接和作者,谢谢。
如果本文对您有帮助,请点击【推荐】您的赞赏将鼓励我继续创作!想跟我一起进步么?那就【关注】我吧。
posted @   赵青青  阅读(566)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10亿数据,如何做迁移?
· 推荐几款开源且免费的 .NET MAUI 组件库
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 易语言 —— 开山篇
· Trae初体验
历史上的今天:
2014-08-06 ReSharper 全教程
2014-08-06 Resharper 详细教程
2014-08-06 C# 泛型约束 xxx Where T:约束(二)
2014-08-06 C# 泛型约束 xxx<T> Where T:约束(一)
CONTENTS
点击右上角即可分享
微信分享提示