修改文件类型图标得方式:
1 使用文件类型指定得图标
.myp
DefaultIcon
(Default) = C:\MyDir\MyProgram.exe,2 //C:\Users\qqq\Desktop\test.ico
2 使用关联程序默认图标
HKEY_CLASSES_ROOT
.myp
(Default) = MyProgram.1
MyProgram.1
DefaultIcon
(Default) = C:\MyDir\MyProgram.exe,2 //C:\Users\qqq\Desktop\test.ico
注意:当同时设置了文件类型得默认图标,又要设置了默认progId(关联程序),且关联程序设置了DefaultIcon,
那么将以关联程序得图表显示,譬如:
.myp
(Default) = MyProgram.1
DefaultIcon
(Default) = C:\MyDir\MyProgram.exe,0 //C:\Users\qqq\Desktop\test.ico
MyProgram.1
DefaultIcon
(Default) = C:\MyDir\MyProgram.exe,2 //C:\Users\qqq\Desktop\test.ico
那么将显示C:\MyDir\MyProgram.exe的第二个图标。
调用SHChangeNotify 以通知shell图标发生改变
参见:https://docs.microsoft.com/zh-cn/windows/win32/shell/how-to-assign-a-custom-icon-to-a-file-type

Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\%s\UserChoice 注册表项也能决定文件类型的图标
譬如:
Software
Microsoft
Windows
CurrentVersion
Explorer
FileExts
.myp
UserChoice
ProgId=MyProgram.1

MyProgram.1DefaultIcon(Default) = C:\MyDir\MyProgram.exe,2 //C:\Users\qqq\Desktop\test.ico或者:shellexIconHandler(default)={xxxxxxxxxxxxxxxxxxxxxxxxxxxx}

修改标准驱动器的图标和标签:
windows 2000下:
修改如下注册表项:
HKEY_CLASSES_ROOT
Applications
Explorer.exe
Drives
譬如:
HKEY_CLASSES_ROOT
Applications
Explorer.exe
Drives
E
DefaultIcon
(Default) = C:\MyDir\MyDrive.exe,3
DefaultLabel
(Default) = MyDrive
其他操作系统:
HKEY_LOCAL_MACHINE
Software
Microsoft
Windows
CurrentVersion
Explorer
DriveIcons
譬如:
HKEY_LOCAL_MACHINE
Software
Microsoft
Windows
CurrentVersion
Explorer
DriveIcons
E
DefaultIcon
(Default) = C:\MyDir\MyDrive.exe,3
DefaultLabel
(Default) = MyDrive
另需调用SHUpdateImage函数
参见:https://docs.microsoft.com/zh-cn/windows/win32/shell/how-to-assign-a-custom-icon-and-label-to-a-drive-letter

图标扩展处理程序
实现2大接口:IPersistFile, IExtractIcon
参考代码:
class ATL_NO_VTABLE Cextension :
public CComObjectRootEx,
public CComCoClass<Cextension, &CLSID_extension>,
public IDispatchImpl<Iextension, &IID_Iextension, &LIBID_ATLProject1Lib, /wMajor =/ 1, /wMinor =/ 0>,
public IPersistFile,
public IExtractIcon
{
public:
Cextension()
{
}

DECLARE_REGISTRY_RESOURCEID(106)

BEGIN_COM_MAP(Cextension)
COM_INTERFACE_ENTRY(Iextension)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IPersistFile)
COM_INTERFACE_ENTRY(IExtractIcon)
END_COM_MAP()

DECLARE_PROTECT_FINAL_CONSTRUCT()HRESULT FinalConstruct()
{return S_OK;
}void FinalRelease()
{
}

public:
//IPersistFile.IPersist Interface
STDMETHOD(GetClassID)(CLSID pClassID);
//IPersistFile Interface
STDMETHOD(IsDirty)(void);
STDMETHOD(Load)(/
[in] / __RPC__in LPCOLESTR pszFileName,
/
[in] / DWORD dwMode);
STDMETHOD(Save)(/
[unique][in] / __RPC__in_opt LPCOLESTR pszFileName,
/
[in] / BOOL fRemember);
STDMETHOD(SaveCompleted)(/
[unique][in] / __RPC__in_opt LPCOLESTR pszFileName);
STDMETHOD(GetCurFile)(/
[out] */ __RPC__deref_out_opt LPOLESTR *ppszFileName);

//IExtractIcon Interface
STDMETHOD(GetIconLocation)(THIS_
UINT uFlags,
Out_writes(cchMax) PWSTR pszIconFile,
UINT cchMax,
Out int * piIndex,
Out UINT * pwFlags);
STDMETHOD(Extract)(THIS_
In PCWSTR pszFile,
UINT nIconIndex,
Out_opt HICON *phiconLarge,
Out_opt HICON *phiconSmall,
UINT nIconSize);
};

//实现:
// extension.cpp: Cextension 的实现

STDMETHODIMP Cextension::GetClassID(CLSID *pClassID){
if (NULL != pClassID) {
*pClassID = CLSID_extension;
}
return S_OK;
}

STDMETHODIMP Cextension::IsDirty(void){
return E_NOTIMPL;
}

STDMETHODIMP Cextension::Load(__RPC__in LPCOLESTR pszFileName,/* [in] */ DWORD dwMode){
wchar_t tmp[1024] = {};
swprintf_s(tmp,1024,L"cur file:%s\n", pszFileName);
OutputDebugString(tmp);
return S_OK;
}

STDMETHODIMP Cextension::Save(/* [unique][in] / __RPC__in_opt LPCOLESTR pszFileName,
/
[in] / BOOL fRemember){
return E_NOTIMPL;
}
STDMETHODIMP Cextension::SaveCompleted(/
[unique][in] */ __RPC__in_opt LPCOLESTR pszFileName){
return E_NOTIMPL;
}

STDMETHODIMP Cextension::GetCurFile(/* [out] */ __RPC__deref_out_opt LPOLESTR *ppszFileName){
return E_NOTIMPL;
}

STDMETHODIMP Cextension::GetIconLocation(THIS_
UINT uFlags,
Out_writes(cchMax) PWSTR pszIconFile,
UINT cchMax,
Out int * piIndex,
Out UINT * pwFlags){
wchar_t path[MAX_PATH] = {};
SHGetSpecialFolderPath(NULL, path, CSIDL_DESKTOPDIRECTORY, FALSE);
PathCombine(path, path, L"test.ico");
if (!PathFileExists(path))
return S_FALSE;
lstrcpy(pszIconFile, path);
*piIndex = 0;
*pwFlags = 0;
return S_OK;
}

STDMETHODIMP Cextension::Extract(THIS_
In PCWSTR pszFile,
UINT nIconIndex,
Out_opt HICON *phiconLarge,
Out_opt HICON *phiconSmall,
UINT nIconSize){
//释放图标
//由shell 自己释放图标返回false,因为该文件只有一张图片,把该图片整体作为图标。如果GetIconLocation中
//指定了索引,那么就得自己处理返回得大小图标了。
return S_FALSE;
}

注:该代码不完整,只做接口实现参考。
参见:https://docs.microsoft.com/zh-cn/windows/win32/shell/how-to-create-icon-handlers

扩展程序如何起作用(被加载)参考:https://docs.microsoft.com/zh-cn/windows/win32/shell/reg-shell-exts(shell开发指南\实现自定义文件格式\使用shell扩展\注册shell扩展程序)

覆盖图标程序:
实现接口:IShellIconOverlayIdentifier
部分实现代码:
class ATL_NO_VTABLE CImpOverlay :
public CComObjectRootEx,
public CComCoClass<CImpOverlay, &CLSID_ImpOverlay>,
public IDispatchImpl<IImpOverlay, &IID_IImpOverlay, &LIBID_iconoverlayLib, /wMajor =/ 1, /wMinor =/ 0>,
public IShellIconOverlayIdentifier
{
public:
CImpOverlay()
{
}

DECLARE_REGISTRY_RESOURCEID(106)

BEGIN_COM_MAP(CImpOverlay)
COM_INTERFACE_ENTRY(IImpOverlay)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IShellIconOverlayIdentifier)
END_COM_MAP()

DECLARE_PROTECT_FINAL_CONSTRUCT()HRESULT FinalConstruct()
{return S_OK;
}void FinalRelease()
{
}

public:

//IShellIconOverlayIdentifier Interface
STDMETHOD(IsMemberOf)(__RPC__in_string LPCWSTR pwszPath,
/* [in] / DWORD dwAttrib);
STDMETHOD(GetOverlayInfo)(/
[size_is][string][out] / __RPC__out_ecount_full_string(cchMax) LPWSTR pwszIconFile,
/
[in] / int cchMax,
/
[out] */ __RPC__out int pIndex,
/
[out] */ __RPC__out DWORD *pdwFlags);
STDMETHOD(GetPriority)(__RPC__out int *pPriority);

};

//接口实现
STDMETHODIMP CImpOverlay::IsMemberOf(__RPC__in_string LPCWSTR pwszPath,
/* [in] */ DWORD dwAttrib){
//返回S_OK代表覆盖,S_FALSE代表不覆盖.
//pwszPath 为将要被覆盖的文件全路径。
if (pwszPath != NULL)
{
wchar_t txt[1024] = { 0 };
swprintf_s(txt, L"CImpOverlay cur file:%s", pwszPath);
OutputDebugString(txt);
}

return S_OK;
}

STDMETHODIMP CImpOverlay::GetOverlayInfo(
/* [size_is][string][out] / __RPC__out_ecount_full_string(cchMax) LPWSTR pwszIconFile,
/
[in] / int cchMax,
/
[out] */ __RPC__out int pIndex,
/
[out] */ __RPC__out DWORD *pdwFlags){
//pwszIconFile返回将要使用的覆盖图标的文件,可以是 .exe 或者 .dll 或者.ico
//pIndex 返回该图标在文件中的索引,针对单一文件包含多个图标的情况
//pdwFlags,2种取值。1:ISIOI_ICONFILE 代表返回了图标文件,2:ISIOI_ICONINDEX 代表图标文件的索引
wchar_t path[MAX_PATH] = {};
SHGetSpecialFolderPath(NULL, path, CSIDL_DESKTOPDIRECTORY, FALSE);
PathCombine(path, path, L"test.ico");
lstrcpy(pwszIconFile, path);

*pIndex = 0;
*pdwFlags = ISIOI_ICONFILE;

return S_OK;
}

STDMETHODIMP CImpOverlay::GetPriority(
/* [out] */ __RPC__out int *pPriority){
//pPriority 优先级,当具有多个图标覆盖扩展程序时,设置优先级决定优先权。推荐设置为0.
*pPriority = 0;
return S_OK;
}

可参考:https://www.codeproject.com/Articles/7484/How-to-overlay-an-icon-over-existing-shell-objects

修改文件类型图标得方式相关推荐

  1. java文件 默认打开方式_修改文件的默认打开方式(亲测有效)

    今天遇到了一个问题,那就是没办法修改文件的默认打开方式,Windos10系统. 可能我稍微有点强迫症什么的,每次默认记事本打开,虽然也可也选择其他的应用打开,但就是没有直接双击打开的爽. 一百度才发现 ...

  2. 更改文件类型图标logo_如何在Windows中更改特定文件类型的图标

    更改文件类型图标logo In the Windows XP days, changing the icon for a specific file type-such as TXT or PNG-w ...

  3. Win7更改文件类型图标

    Win7更改文件类型图标 使用过win7的人,肯定都知道win7没有一个现成的提供你更改文件图标的工具.比如.*.rmvb.*.doc,我们并不想使用其原先的默认图标:或者是某个软件因为下载的是硬盘版 ...

  4. Discuz论坛中新增文件类型图标的方法

    # 新增文件类型图标的方法 ​    pptx文件不在论坛默认的文件类型范围之内,因此上传的pptx文件图标显示为未知,这对于我这种强迫症患者怎么可以忍受,解决方案如下 ## 图片文件的下载 ​    ...

  5. python文件默认打开方式修改_pycharm修改文件的默认打开方式的步骤

    有时我们用pycharm打开某个文件的时候,默认的打开方式是不正确的,那么如何设置呢?下面小编给大家分享一下. 首先我们点击File菜单,然后选择Setting,如下图所示 接着找到Editor下面的 ...

  6. android 自定义文件夹图标,Launcher3 Android10.0修改文件夹图标为九宫格

    Launcher3 Android10.0修改文件夹图标为九宫格 Launcher3 Android10.0修改文件夹图标为九宫格 文件夹图标在Launcher里表示为预览文件夹 1.修改预览文件夹的 ...

  7. Windows7修改文件默认图标

    Windows7下没有提供修改文件默认图标的工具,只能通过注册表修改. 1.  进入注册表,在 HKEY_CURRENT_USER\Software\Microsoft\Windows\Current ...

  8. Windows11修改文件夹图标的方法

    1.将.ico图标文件放入文件夹 2.点击上面三点,打开 选项 3.点击查看,在下面的高级设置中找到"隐藏受保护的操作系统文件(推荐)"取消勾选,确定 4.打开desktop.in ...

  9. 怎么设置计算机的快捷键图标,Win7旗舰版如何更改桌面快捷方式和文件类型图标...

    每个人都喜欢自己独具个性的东西,因此在使用Win7系统过程中,很多用户为了打造属于自己的个性化桌面,都会更换为自己喜欢的有个性的图标,但是也有些用户不知如何更换系统图标,那么请跟着小编一起来学习一下 ...

  10. 修改注册表文件改变Okular软件PDF文件类型图标

    一.修改需求 因为学习需要,经常查看各种PDF,自带的Microsoft Edge阅读PDF文件虽然迅速简洁,但是侧栏的目录并不太好用,尤其是当目录太多时,侧栏显示效果并不好,且不能自由调整大小,查询 ...

最新文章

  1. python的时间序列预测,用python中的时间序列预测
  2. 蜗蜗 Linux内核芬妮下,Linux内核的整体架构
  3. 转: Python集合(set)类型的操作
  4. Eclipse 用Hibernate Tools 生成 .hbm cfg.xml等文件
  5. wxWidgets:wxColourPickerEvent类用法
  6. Unix Shell 通配符、转义字符、元字符、特殊字符
  7. c# union结构体_P/Invoke各种总结(八、在C#中使用Union联合体)
  8. 操作需要计算机管理员权限,win10系统操作文件时提示需要管理员权限的处理教程...
  9. Llinux文件操作四剑客
  10. Eclipse智能感知功能优化
  11. 深入理解JAVA集合系列二:ConcurrentHashMap源码解读
  12. vi编辑器使用技巧篇1
  13. python爬虫requests源码链家_python3 爬虫教学之爬取链家二手房(最下面源码) //以更新源码...
  14. python关于二手房的课程论文_python 爬虫基础-二手房信息获取为例
  15. sql 连续两个月活跃的用户
  16. delphi学习笔记(1)-object pascal语言的数据类型 选择自 xmz2629 的 Blog
  17. pyqt5 图片随窗口变化等比例缩放
  18. 已知点的经纬度坐标计算/读取DEM高程信息/海拔高度
  19. 操作系统之经典 | 生产者与消费者问题
  20. mac之把打开终端设置快捷键为Ctrl+Alt+T

热门文章

  1. 领导力教练:世界著名企业教练们的实践心得(原书第3版)
  2. diskgenius做win10系统迁移
  3. 银河麒麟桌面操作系统V10node.js 14安装小助手
  4. 基于Python的淘宝用户行为分析
  5. 中国外显子组测序行业市场供需与战略研究报告
  6. 学前儿童健康教育 复习资料 渝粤题库整理
  7. 大学生对于繁体字的态度与认知情况调查
  8. 公网IP、私网IP、动态IP、静态IP
  9. 跳跃表(Skip list)原理
  10. 网红必备神器,抖音短视频去水印秘籍-抖音-快手-微视-全名小视频