windows程序图标缓存

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

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

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

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

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

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

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

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

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

IconViewer

下载地址:Download IconViewer - MajorGeeks

使用方法

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

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

icon制作方法

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

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

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

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

python脚本提取icon

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

# -*- 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() #任务开始

windows应用程序icon缓存、查看图标、icon制作方法的更多相关文章

  1. Expo大作战(十一)--expo中的预加载和缓存资产(Preloading & Caching Assets),expo中的图标 (Icon)

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  2. Android 应用程序的图标 (Icon) 应该设计成多大?

    应用程序图标 (Icon)应当是一个 Alpha 通道透明的32位 PNG 图片.由于安卓设备众多,一个应用程序图标需要设计几种不同大小,如:LDPI (Low Density Screen,120 ...

  3. (六)绘图,文本编程,定时器,菜单,图标icon,消息类型

    1,简单绘图 画直线 a,鼠标按下和抬起 void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代 ...

  4. 如何在移动端app中应用字体图标icon fonts (转)

    原文: http://www.cnblogs.com/willian/p/4166757.html?utm_source=tuicool&utm_medium=referral How to ...

  5. 如何在移动端app中应用字体图标icon fonts

    How to use icon fonts in your mobile apps 在任何APP设计中实现可图形的矢量缩放最完美的方式是使用字体图标. 移动端的设计变的越来越复杂.原因在于多样的屏幕尺 ...

  6. Font Awesome-用CSS实现各种小图标icon

    Font Awesome为您提供可缩放的矢量图标,您可以使用CSS所提供的所有特性对它们进行更改,包括:大小.颜色.阴影或者其它任何支持的效果.官网:http://fontawesome.dashga ...

  7. amazeui学习笔记--css(常用组件6)--图标Icon

    amazeui学习笔记--css(常用组件6)--图标Icon 一.总结 1.关注用法即可:在 HTML 上添加添加 am-icon-{图标名称} class. <span class=&quo ...

  8. 微信小程序把玩(十一)icon组件

    原文:微信小程序把玩(十一)icon组件 这些是提供的所支持的图标样式,根据需求在此基础上去修改大小和颜色. 主要属性: 使用方式: wxml <!--成功图标--> <icon t ...

  9. Jetpack Compose学习(3)——图标(Icon) 按钮(Button) 输入框(TextField) 的使用

    原文地址: Jetpack Compose学习(3)--图标(Icon) 按钮(Button) 输入框(TextField) 的使用 | Stars-One的杂货小窝 本篇分别对常用的组件:图标(Ic ...

  10. 测试开发【提测平台】分享14-Vue图标Icon几种用法并利用其一优化菜单

    微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 回归主线更新,由于本次知识点只有一个,就不给思维导图了,在上系列测试平台开发实践中主要学习了页面直接的转跳方法和远程搜索的如何做,最终实现 ...

随机推荐

  1. 1个案例读懂——游戏产品如何用 A/B 测试做增长

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 随着国内游戏用户数量趋于饱和,中国游戏产业也从高速成长期逐渐转型,市场成熟度提升,竞争趋于精细化. 随着游戏出海以 ...

  2. Appium常用定位方法讲解

    Appium常用定位方法讲解 对象定位是自动化测试中很关键的一步,也可以说是 最关键的一步,毕竟你对象都没定位那么你想操作也不行,下面我们来看常用的一些定位方式. ID定位(取resource-id的 ...

  3. git或gitee 提交代码到远程仓库

    本文为博主原创,未经允许不得转载: 1. 选中远程仓库,并fork 指定的项目到自己的私仓: fork 之后,打开我的仓库便能看到刚刚fork 的项目. 2. clone 项目代码到自己电脑的本地仓库 ...

  4. STM32F429 实测基本数据类型占用空间

    实测代码 1 void CalculateDataTypeSize(void) 2 { 3 printf("sizeof(char} = %u\r\n", sizeof(char) ...

  5. javase项目 正常导入jar 包

    1,在 java project 目录下新建 lib 文件夹 2,将 mysql 的 jar 包 复制到 新建的 lib 文件夹 3,选中 lib 下的 jar 包 , 右键点击选择 build pa ...

  6. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.11.25)

    来给大家伙送福利了! 一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘, ...

  7. MySQL 8.2.0部署安装验证

    MySQL 8.2.0部署安装验证 背景 昨天捯饬了半天Oracle23c Free版本发现自己白忙活了. 然后想着继续看一下 MySQL8.2. 看看会不会又继续白忙活 下载与安装 https:// ...

  8. [转帖]tcp、http和socket的区别

    https://www.jianshu.com/p/88d69454bdde 一:tcp协议 tcp协议属于传输层协议(UDP也属于传输层协议,但是UDP协议是无状态的).建立一个TCP连接需要三次握 ...

  9. [转帖]tikv性能参数调优

    https://www.cnblogs.com/FengGeBlog/p/10278368.html#:~:text=max-%20bytes%20-for-level-%20base%20%3D%2 ...

  10. [转帖]Fiddler抓取Chrome浏览器访问baiud.com报NET::ERR_CERT_COMMON_NAME_INVALID

    错误现象 解决方法: 1.Chrome浏览器地址栏中输:chrome://net-internals/#hsts 2.在Query HSTS/PKP domain处搜索www.baidu.com网站, ...