Shell图标覆盖(C#)

6
我需要一种使用C#或C ++在Windows XP / Vista中为文件夹和文件创建图标覆盖的方法? 有任何示例吗?
谢谢, -Sean!

5
请至少使用C/C++完成此任务,不应在.NET中构建Shell扩展。 - Lasse V. Karlsen
2个回答

11

不要这样做!拜托了,请一定不要。

这会破坏很多应用程序。Shell扩展必须永远不使用.NET框架(或任何其他类似的框架)。

这里有一个解释,为什么你不能这么做。

请使用C/C++编写您的扩展,而不要使用C#。

更新: 即使在.NET4中可以在一个进程中拥有多个框架版本,但微软仍然不建议并且不支持这样做! 请参阅文章以了解原因:

[...] 这些问题导致我们正式建议不使用和不支持使用托管代码开发进程内Shell扩展。


1
我觉得你误解了我的意思。我想用C++编写扩展,并从C#中使用它。这可行吗? - Sean
1
你想在自己的应用程序中像资源管理器一样获取叠加层吗?现在当然可以做到,而不会破坏其他应用程序。 - Stefan
1
但是,如果您只想在C#应用程序中使用叠加层,您根本不需要编写叠加层处理程序 - 这仅适用于资源管理器。如果您需要自己的叠加层,请直接进行操作,无需使用叠加层处理程序。Windows列表控件已经支持叠加层(您必须向控件添加图像列表,然后在项目掩码中从该列表中指定16个可能的叠加层图标之一)。 - Stefan
1
这很有帮助,但实际上我在“Microsoft Platform SDK”中找到了一个非常好的例子,而且它可以直接编译,没有任何问题。不过还是感谢你的帮助。 ;) - Sean
1
看起来你可以安全地使用.NET 4.0编写外壳扩展。这是因为.NET 4.0运行时可以与其他版本的.NET运行时同时加载到同一进程中。参见- http://blogs.msdn.com/b/codefx/archive/2010/09/14/writing-windows-shell-extension-with-net-framework-4-c-vb-net-part-1.aspx - Brandon Cuff
显示剩余4条评论

7

Tigris的TortoiseSVN产品大量使用图标覆盖,这些覆盖由几个Tortoise产品共享的库提供,这些覆盖本身是用C++编写而不是C#。

TortoiseOverlays项目的文档解释了它们如何使用以及遇到的问题(用户名:guest,空密码),GPL源代码在Subversion存储库中(与上述相同的用户名/密码)。

来自文档的片段:

TortoiseOverlays会向资源管理器注册自己以处理九种状态,即注册了九个覆盖处理程序。资源管理器进程初始化TortoiseOverlays处理程序,并调用其IShellIconOverlayIdentifier :: GetOverlayInfo()方法。TortoiseOverlays在HKLM \ Software \ TortoiseOverlays \ Statusname下查找已注册的覆盖处理程序,并调用它们的GetOverlayInfo()方法以便它们也可以进行初始化(请注意,您的处理程序所做的任何图标名称、索引等更改都将被稍后覆盖并且不会使用 - 现在是TortoiseOverlays处理图标)。初始化后,TortoiseOverlays将每个调用转发到其IShellIconOverlayIdentifier :: IsMemberOf()方法中的其他处理程序。第一个返回S_OK的处理程序决定是否显示图标。

1
太棒了!我会看一下这个的。你知道我怎么把它实现到我正在开发的C#项目中吗?我基本上只需要注册一个DLL,对吧? - Sean
1
正如Stefan所提示的那样,TortoiseSVN shell扩展程序采用非托管代码编写是有原因的。您可以始终将大部分代码编写为非托管代码,然后让它调用到您的.NET应用程序中。 - Richard Slater
1
谢谢。这正是我计划要做的,我从未打算暗示我想用C#编写Shell扩展代码,我只是想从C#中访问C++代码。 - Sean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接