首页 > 系统相关 >windows应用程序icon缓存、查看图标、icon制作方法

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

时间:2023-08-06 22:35:20浏览次数:40  
标签:resId icon windows dic ico path x00 图标

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理论上都可以使用。

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

标签:resId,icon,windows,dic,ico,path,x00,图标
From: https://www.cnblogs.com/zhaoqingqing/p/17610239.html

相关文章

  • Windows11使用docker desktop安装kafka&zookeeper集群
    docker-compose安装zookeeper集群参考文章:http://t.csdn.cn/TtTYIhttps://blog.csdn.net/u010416101/article/details/122803105?spm=1001.2014.3001.5501准备工作:​ 在开始新建集群之前,新建好文件夹,用来挂载kafka、zookeeper数据,如下:zookeeper文件夹D:\soft\docker\zookee......
  • Oracle 11g Windows迁移至linux方案
    1.前言根据迁移规范要求,特编写xxx数据库迁移至linux环境操作方案。2.方案描述2.1环境描述源库数据量为20T,操作系统为WindowsServer200864bit,数据库版本为oracle11.2.0.1,目标库操作系统为Linuxredhat7.6,数据库版本为11.2.0.4。详细信息如下:源端数据库:业务系统  数据库 I......
  • Sqlite windows11 安装与使用
    首先进入Sqlite官方网址:https://www.sqlite.org/download.html然后下载下面框起来的两个压缩文件 下载完成后解压接下来去配置环境变量,右键此电脑->属性->高级系统设置->环境变量->系统变量(新建)->变量名输入path,变量值输入解压出来的sqlite文件路径然后cmd测试一下 ......
  • Windows 在VMware Workstation 17上安装macOS Sonoma 虚拟机
    前言macOS在一些方面做得比Windows更好。但是,macOS只能安装在苹果电脑上,虽然黑苹果能满足部分人的要求,但依然有大部分机型无法安装黑苹果。而在虚拟机上,大部分用户都可以用上macOS,虽然流畅度等一般都没有白苹果、黑苹果好,但用来体验和日常使用是问题不大的。如果用来开发或编程之类......
  • Windows 11跳过网络连接设置方法
    在第一次启动Windows11的时候,会提示连接到网络,如果没有网络的话,则无法进入下一步,如下图: 通过输入命令oobe\/bypassnro可以跳过连接到网络,步骤如下:1.在“让我们为你连接的网络”这一步,按键盘【Shift】+【F10】或者【FN】+【Shift】+【F10】会弹出命令提示符,输入命令oobe\bypa......
  • 使用wepe 修复windows 引导
    准备一个u盘请准备一个空的的u盘,或者提前将数据备份,因为后面会格式化u盘。下载wepehttps://mirrors.sdu.edu.cn/software/Windows/WePE/WePE_64_V2.3.exe插入u盘,并且下载完成以后,双击WePE_64_V2.3.exe,然后点击这个选项,安装到u盘,点击立即安装PE到u盘开始制作这个进度条......
  • windows相关DOS命令简介与基操
    作为程序员要求掌握最基本的windows相关的DOS命令(详细版)一、DOS命令、cmd、windows操作系统中保留的DOS命令分别是什么?1.DOS命令是什么?DOS命令,计算机术语,是指DOS操作系统的命令,是一种面向磁盘的操作命令,主要包括目录操作类命令、磁盘操作类命令、文件操作类命令和其它命令。......
  • vmware workstation pro17 安装 windows server 2022
    本文实验所需环境vmwareworkstationpro17windowserver2022镜像文件:zh-cn_windows_server_2022_updated_april_2023_x64_dvd_644d5669.iso镜像文件下载:NEXT,ITELLYOU一、vmware创建windowserver2022虚拟机安装步骤,打开vmwareworkstationpro17,新建虚拟机,选......
  • 【定制项目】【M15 消防安全宣传】【横屏版】主要模块:视频 + 音频 + 图标 + 问答游戏
    之前客户指定要求竖屏版,所以只做了竖屏效果(项目管理箴言-做只做需要的工作,不要镀金),后来客户采购了一批横屏设备(毕竟横屏播放视频才是王道),所以代码升级支持横屏版。效果展示主页公益宣传片(视频MP4), 火灾启示录(视频MP4),消防宣教员(视频MP4),消防设施原理(视频MP4) 视频播放页-  自动......
  • Windows系统快速安装Superset 0.37
    Windows系统安装Superset0.37Superset 是一款由Airbnb开源的“现代化的企业级BI(商业智能)Web应用程序”,其通过创建和分享dashboard,为数据分析提供了轻量级的数据查询和可视化方案。windows系统下安装superset大同小异,本文通过Win10系统演示整个安装过程。win10安装python3.......