Windows Shell编程实现重叠图标IconOverlay
转载:https://www.codeproject.com/Articles/7484/How-to-overlay-an-icon-over-existing-shell-objects
转载:https://blog.csdn.net/u012741077/article/details/50641518
系统默认的: 贴上图标后:

第一步:新建一个ATL项目,输入工程名:TxtInfo,具体如下图:

第二步:点击next

第三步:应用类型选择动态库链接(DLL),同时勾选 允许合并代理/存根代码和支持MFC,最后点击Finish。

第四步:新建一个ATL简单对象(英文版的VS为ATLSimple Object)


单击 Add,在第二页面中, 在Short Name编辑框中输入TxtShlExt,点击 Finish.

第五步:开始我们需要添加IShellIconOverlayIdentifier到CTxtShlExt实现的接口列表中.打开 TxtShlExt.h, 并添加如下代码:
class ATL_NO_VTABLE CTxtShlExt :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CTxtShlExt, &CLSID_TxtShlExt>,
public IDispatchImpl<ITxtShlExt, &IID_ITxtShlExt, &LIBID_IconOverlayLib, /*wMajor =*/ , /*wMinor =*/ >,
public IShellIconOverlayIdentifier//添加实现接口
{
public:
CTxtShlExt()
{
} DECLARE_REGISTRY_RESOURCEID(IDR_TXTSHLEXT) BEGIN_COM_MAP(CTxtShlExt)
COM_INTERFACE_ENTRY(ITxtShlExt)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IShellIconOverlayIdentifier)//添加接口入口
END_COM_MAP() DECLARE_PROTECT_FINAL_CONSTRUCT() HRESULT FinalConstruct()
{
return S_OK;
} void FinalRelease()
{
} public:
//实现接口的三个函数
STDMETHOD(GetPriority(THIS_ _Out_ int * pIPriority));
STDMETHOD(IsMemberOf(THIS_ _In_ PCWSTR pwszPath, DWORD dwAttrib));
STDMETHOD(GetOverlayInfo(THIS_ _Out_writes_(cchMax) PWSTR pwszIconFile, int cchMax, _Out_ int * pIndex, _Out_ DWORD * pdwFlags)); }; OBJECT_ENTRY_AUTO(__uuidof(TxtShlExt), CTxtShlExt)
TxtShlExt.cpp
//pwszPath 为当前文件的全路径
STDMETHODIMP CTxtShlExt::IsMemberOf(THIS_ _In_ PCWSTR pwszPath, DWORD dwAttrib)
{
HRESULT hRef = S_FALSE; wchar_t* fileClass = _wcsdup(wcsrchr(pwszPath, '.'));
if (fileClass != NULL)
{
if (_wcsicmp(fileClass, L".txt") == )
{//判断是否是txt后缀的文件
hRef = S_OK;
}
} free(fileClass);
//如果是符合要求的文件,就返回S_OK
return hRef;
} //pwszIconFile 用于设置图标文件的路径,路径长度不能超过cchMax个字符。
//pIndex 用于设置图标覆盖的先后顺序
STDMETHODIMP CTxtShlExt::GetOverlayInfo(THIS_ _Out_writes_(cchMax) PWSTR pwszIconFile, int cchMax, _Out_ int * pIndex, _Out_ DWORD * pdwFlags)
{
WCHAR *buff = new WCHAR[cchMax];
//获取当前程序的路径,而不是调用该程序的程序的路径,因为调用该程序的是资源管理器(explorer.exe),直接过去路径的话,获取的是资源管理器的路径。
GetModuleFileNameW(_AtlBaseModule.GetModuleInstance(), buff, cchMax); WCHAR *nChar = wcsrchr(buff, L'\\');
if (nChar != NULL)
{//写入当前程序路径下的图标的名字
wcscpy_s(nChar, cchMax - wcslen(buff), L"\\star.ico");
wcscpy_s(pwszIconFile, cchMax, buff);
} //设置顺序
*pIndex = ; //标识所修改过的数据pwszIconFile 与 pIndex
*pdwFlags = ISIOI_ICONFILE | ISIOI_ICONINDEX; free(buff);
//完成返回S_OK
return S_OK;
} STDMETHODIMP CTxtShlExt::GetPriority(THIS_ _Out_ int * pIPriority)
{
*pIPriority = ;
return S_OK;
}
第六步:注册COM接口
方式一:HKLM内容加入TxtShlExt.rgs中
编辑TxtShlExt.rgs文件

方式二:HKLM内容加入IconOverlay.rgs中
编辑IconOverlay.rgs

这段代码的意思就是将这个程序注册到资源管理器下的注册表项中。
需要注意的是需要区分系统是X86/X64,如果是X64的系统,请生成X64的程序,要不然不起作用的。
然后将程序中标明的图标的名字“star.ico”的图标与生成的程序放在一个目录。
用命令行注册COM :regsvr32 dll的绝对路径
注:必须以管理员运行cmd


卸载COM: regsvr32 /u dll的绝对路径

程序虽然注册成功了,但是还没有真正被使用,需要重启资源管理器,可以手动重启下。或在控制台下输入以下重启命令。
taskkill /f /im explorer.exe & explorer
重启后就可以看到效果了!

Windows Shell编程实现重叠图标IconOverlay的更多相关文章
- C#)Windows Shell 编程系列5 - 获取图标
原文 C#)Windows Shell 编程系列5 - 获取图标 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 编程系列4 - 上下 ...
- [转]Windows Shell 编程 第二章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987893】
第二章Shell的结构 “Shell 编程”的大伞之下有大量的API函数和COM接口.这个种类繁多的‘命令’集允许你用不同的方法对Windows Shell进行编程.函数和接口并不是两种提供相同功能 ...
- [转]Windows Shell 编程 第九章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987969】
第九章 图标与Windows任务条 如果问一个非程序人员Windows最好的特色是什么,得到的答案应该是系统最有吸引力的图标.无论是Windows98现在支持的通用串行总线(USB)还是WDM(看上去 ...
- (C#)Windows Shell 编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令
原文(C#)Windows Shell 编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:( ...
- windows编程之Windows Shell 编程
参考书<VC++ Windows Shell Programming> 这里仅仅是记录下该资源,推荐到下文列出的连接进行查看 用VC++ 进行Windows Shell 扩展编成 ...
- (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单
原文 (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单 接上一节:(C#)Windows Shell 编程系列2 - 解释,从“桌面”开始展开这 ...
- (C#)Windows Shell 编程系列2 - 解释,从“桌面”开始展开
原文 (C#)Windows Shell 编程系列2 - 解释,从“桌面”开始展开 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一篇:(C#)Windows Shell 编 ...
- (C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹
原文 (C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) Windows Shell 编程,即 Windows ...
- [转]Windows Shell 编程 第三章 【转自:http://blog.csdn.net/wangqiulin123456/article/details/7987901】
第三章 操作文件 我依然清楚地记得,Windows95 的贝塔版出现的情形,它在朋友之间和学院中传播,好酷,全新的文件管理器,一种全图标,全彩色可客户化的界面,以及活泼的动画标识使得在文件拷贝和删除方 ...
随机推荐
- 当我的url请求会变成jsp页面路径时的解决办法
@RequestMapping(value="shippingOrder") $.post("/ezsh/orderAd/shippingOrder",para ...
- spring 对jdbc的简化
spring.xml <!-- 加载属性配置文件 --> <util:properties id="db" location="classpath:db ...
- php开启pdo扩展
在Windows环境下php 5.1以上版本中,pdo和主要数据库的驱动同php一起作为扩展发布,要激活它们只需要简单地编辑php.ini文件. 打开php.ini配置文件,找到extension=p ...
- LeetCode104.二叉树最大深度
给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例:给定二叉树 [3,9,20,null,null,15,7], ...
- Nginx查看并发链接数
一.通过界面查看通过web界面查看时Nginx需要开启status模块,也就是安装Nginx时加上 --with-http_stub_status_module 一.通过界面查看 通过web界面查看时 ...
- HighCharts学习笔记(一)
HighChars基本概述 Highcharts是一个纯js写成的插件库,很好的外观表现可以满足任何图标需求. 开始使用chart之前进行配置 全局配置: Highcharts.setOptions( ...
- hdu4670 树分治
这题说的给了一颗树 然后树上有一些整数值,分别由他给的那30个素数组成,有多少条路径的路径上的点的乘积为立方数, 把每个数分解成相应的素数模3后的值,然后压缩为一个3进制的数 然后进行树的分支 #in ...
- Join The Future (剪枝 + 状态压缩)
一道暴力搜索的恶心剪枝题目. 先处理好某个点确定之后其他点的也确定的是谁,还有分别为什么情况,分别用vis,sta来记录.当然可以直接使用一个3进制数来表示,但是这里需要额外写一个三进制数求值的函数较 ...
- STL容器之deque
[1]deque容器 deque 是对 vector 和 list 优缺点的结合,它是处于两者之间的一种容器. [2]deque方法集 应用示例代码: #include <deque> # ...
- OpenVPN 服务端(pritunl)的一些运维经验
1.当服务端部署在docker中,重启机器之后,docker服务会启动,pritunl的docker容器也会跟着自动启动.但此时,一些系统服务还未完全启动成功,导致会有一些pritunl server ...