求助:叠加图标的Shell扩展的代码(winform c#)

低调de色 2009-11-25 05:34:39
求助

文件夹共享也会在原有的图标下面出现个手的图标



效果:


类似快捷方式会在原有的图标左下方重叠个小箭头的图标
...全文
449 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
godlxldog 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jiangsheng 的回复:]
.Net 4.0之前微软不支持用托管代码写shell扩展。
[/Quote]
不会吧,我在3.5下可以阿,只是还不稳定,还在改进中,但是调试的时候确实调到了阿.
cstester 2009-11-28
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 kokbora_007 的回复:]
引用 15 楼 cstester 的回复:
其实我个人觉得,那并不是叠加, 用过vs 2008的朋友 都知道。 vs2008 创建的 sln ,和2005的就不一样。
  一个左上角标的是 9,一个是8 ,为什么相同的文件类型 icon却不一样。。

  后来看了一个文章。 是对shell扩展。 虽然不支持,但是还是可以实现的。

我当时碰到过和你差不多少的问题。 用了这做法就做出来了,。

参考


桌面的快捷方式是叠加的,在注册表修改还能去掉小箭头
[/Quote]

但是用这办法也能实现。。
蒋晟 2009-11-26
  • 打赏
  • 举报
回复
.Net 4.0之前微软不支持用托管代码写shell扩展。
卧_槽 2009-11-26
  • 打赏
  • 举报
回复
好东西
cstester 2009-11-26
  • 打赏
  • 举报
回复
其实我个人觉得,那并不是叠加, 用过vs 2008的朋友 都知道。 vs2008 创建的 sln ,和2005的就不一样。
一个左上角标的是 9,一个是8 ,为什么相同的文件类型 icon却不一样。。

后来看了一个文章。 是对shell扩展。 虽然不支持,但是还是可以实现的。

我当时碰到过和你差不多少的问题。 用了这做法就做出来了,。

参考
蒋晟 2009-11-26
  • 打赏
  • 举报
回复
用非托管代码实现
低调de色 2009-11-26
  • 打赏
  • 举报
回复
12楼引用错了,不好意。。。
[Quote=引用 11 楼 jiangsheng 的回复:]
.Net 4.0之前微软不支持用托管代码写shell扩展。
[/Quote]
那要实现这种功能,还有什么方法能实现。。。
低调de色 2009-11-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wartim 的回复:]
另外 GetOverlayInfo里还有一句
SB.CopyTo(0, pwszIconFile, cchMax, SB.Length);
[/Quote]
那要实现这种功能,还有什么方法能实现。。。
低调de色 2009-11-26
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 cstester 的回复:]
其实我个人觉得,那并不是叠加, 用过vs 2008的朋友 都知道。 vs2008 创建的 sln ,和2005的就不一样。
一个左上角标的是 9,一个是8 ,为什么相同的文件类型 icon却不一样。。

后来看了一个文章。 是对shell扩展。 虽然不支持,但是还是可以实现的。

我当时碰到过和你差不多少的问题。 用了这做法就做出来了,。

参考
[/Quote]

桌面的快捷方式是叠加的,在注册表修改还能去掉小箭头
wartim 2009-11-25
  • 打赏
  • 举报
回复
另外 GetOverlayInfo里还有一句
SB.CopyTo(0, pwszIconFile, cchMax, SB.Length);
wartim 2009-11-25
  • 打赏
  • 举报
回复
因为c#的dll 没有 dllmain,所以机制可能也有问题
wartim 2009-11-25
  • 打赏
  • 举报
回复
这是网上的一段用delphi写的片段
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}
悔说话的哑巴 2009-11-25
  • 打赏
  • 举报
回复
帮顶
a296694166 2009-11-25
  • 打赏
  • 举报
回复
jf
noway8881 2009-11-25
  • 打赏
  • 举报
回复
这个还真不知道。
只知道取一般的图标。
特别 2009-11-25
  • 打赏
  • 举报
回复
不知道用什么方法
要是任务紧急的话,我会首先取出该类文件原来默认的图标(关于这点搜索一下容易找到)
然后准备一套透明的附加图,如手形、锁、箭头等,然后用GID+自己绘出来先用着再说
sosoyiyi 2009-11-25
  • 打赏
  • 举报
回复
母鸡秃
angel6709 2009-11-25
  • 打赏
  • 举报
回复
母鸡
");

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧