求助:叠加图标的Shell扩展的代码(winform c#) 求助文件夹共享也会在原有的图标下面出现个手的图标效果:类似快捷方式会在原有的图标左下方重叠个小箭头的图标 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不知道用什么方法要是任务紧急的话,我会首先取出该类文件原来默认的图标(关于这点搜索一下容易找到)然后准备一套透明的附加图,如手形、锁、箭头等,然后用GID+自己绘出来先用着再说 http://www.codeproject.com/KB/shell/systemiconsimagelist.aspx 这是网上的一段用delphi写的片段Delphi编写定制显示叠加图标的Shell扩展图标叠加扩展处理器主要实现接口 IShellIconOverlayIdentifierhttp://www.relatedtechnology.cn/web/info_hrsojlosrzffrrosjcc.html我写成c#的,注册完dll,修改完注册表后,新开一个资源管理器看却没有效果,好像哪里还有问题,写得不对,也不清楚dll到底有没有调用,还是只读没判断对,所以仅供参考了using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Runtime.InteropServices ;[Guid("6F9619FF-8B86-D011-B42D-00C04FC964FF")] interface IShellIconOverlayIdentifier{ int IsMemberOf(Char[] pwszPath,ushort dwAttrib); int GetOverlayInfo(Char[] pwszIconFile,int cchMax,ref int pIndex,ref ushort pdwFlags); int GetPriority(out int pIPriority);}public class Class1 : IShellIconOverlayIdentifier{ int S_OK = 0; int S_FALSE = 1; int faReadonly = 1; ushort ISIOI_ICONFILE = 1; public int IsMemberOf(char[] pwszPath, ushort dwAttrib) { if ((dwAttrib & faReadonly) == faReadonly) return S_OK; else return S_FALSE; } public int GetPriority(out int pIPriority) { pIPriority = 0; return S_OK; } public int GetOverlayInfo(char[] pwszIconFile, int cchMax, ref int pIndex, ref ushort pdwFlags) { String OverlayPath = @"c:\x.ico"; StringBuilder SB = new StringBuilder(OverlayPath, cchMax); pdwFlags = ISIOI_ICONFILE; return S_OK; }}[assembly: ComVisible(true)]COM互操作打勾注册dll regasm c:\classlibrary1.dll注册表:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\ShellExt\ 新建项:{6F9619FF-8B86-D011-B42D-00C04FC964FF}HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved 新建二进制值:{6F9619FF-8B86-D011-B42D-00C04FC964FF} 因为c#的dll 没有 dllmain,所以机制可能也有问题 另外 GetOverlayInfo里还有一句 SB.CopyTo(0, pwszIconFile, cchMax, SB.Length); .Net 4.0之前微软不支持用托管代码写shell扩展。 其实我个人觉得,那并不是叠加, 用过vs 2008的朋友 都知道。 vs2008 创建的 sln ,和2005的就不一样。 一个左上角标的是 9,一个是8 ,为什么相同的文件类型 icon却不一样。。 后来看了一个文章。 是对shell扩展。 虽然不支持,但是还是可以实现的。我当时碰到过和你差不多少的问题。 用了这做法就做出来了,。 参考 要从华为T2000网管获取告警信息,但找不到corba北向接口资料。有人能提供点吗? c# 有关注释问题 窗体关闭 asp.net母版页 关于输入法的自动转化问题 新手提问? 我开一个线程去执行一个函数,这个函数有带有参数,请问怎么做 C#.net中怎么从子页面传值到父页面 C#能不能在状态栏上显示进度条?有不有相应的例子.. 思归兄,你们看这些关于DATAGRID问题能解决吗 C#中access数据库 查询 自己开发了一个日期控件,怎么添加自定义事件啊
要是任务紧急的话,我会首先取出该类文件原来默认的图标(关于这点搜索一下容易找到)
然后准备一套透明的附加图,如手形、锁、箭头等,然后用GID+自己绘出来先用着再说
Delphi编写定制显示叠加图标的Shell扩展
图标叠加扩展处理器主要实现接口 IShellIconOverlayIdentifier
http://www.relatedtechnology.cn/web/info_hrsojlosrzffrrosjcc.html我写成c#的,注册完dll,修改完注册表后,新开一个资源管理器看却没有效果,好像哪里还有问题,写得不对,也不清楚dll到底有没有调用,还是只读没判断对,所以仅供参考了
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices ;[Guid("6F9619FF-8B86-D011-B42D-00C04FC964FF")]
interface IShellIconOverlayIdentifier
{
int IsMemberOf(Char[] pwszPath,ushort dwAttrib);
int GetOverlayInfo(Char[] pwszIconFile,int cchMax,ref int pIndex,ref ushort pdwFlags);
int GetPriority(out int pIPriority);
}public class Class1 : IShellIconOverlayIdentifier
{
int S_OK = 0;
int S_FALSE = 1;
int faReadonly = 1;
ushort ISIOI_ICONFILE = 1; public int IsMemberOf(char[] pwszPath, ushort dwAttrib)
{
if ((dwAttrib & faReadonly) == faReadonly)
return S_OK;
else
return S_FALSE;
} public int GetPriority(out int pIPriority)
{
pIPriority = 0;
return S_OK;
} public int GetOverlayInfo(char[] pwszIconFile, int cchMax, ref int pIndex, ref ushort pdwFlags)
{
String OverlayPath = @"c:\x.ico";
StringBuilder SB = new StringBuilder(OverlayPath, cchMax);
pdwFlags = ISIOI_ICONFILE;
return S_OK;
}
}
[assembly: ComVisible(true)]
COM互操作打勾注册dll regasm c:\classlibrary1.dll注册表:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\ShellExt\ 新建项:{6F9619FF-8B86-D011-B42D-00C04FC964FF}HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved 新建二进制值:{6F9619FF-8B86-D011-B42D-00C04FC964FF}
SB.CopyTo(0, pwszIconFile, cchMax, SB.Length);
一个左上角标的是 9,一个是8 ,为什么相同的文件类型 icon却不一样。。 后来看了一个文章。 是对shell扩展。 虽然不支持,但是还是可以实现的。我当时碰到过和你差不多少的问题。 用了这做法就做出来了,。 参考