VB.net or Windows API: 如何找出文件资源管理器使用了哪些图标?

VB.net or Windows API: How to find out which icons the file explorer uses?

我目前正在使用 VB.net 开发 Windows 桌面应用程序,我希望在其中直接集成文件和文件夹浏览界面,即用户不必打开文件浏览器select 个文件的对话框。

我的文件浏览器应该类似于原始的 Windows 文件浏览器,至少在最常见的位置使用相同的图标。例如,我想包含带有适当图标的 "Favorites" 文件夹(请注意,这不是 IE 收藏夹文件夹,而是当您在地址栏中键入 shell:links 时出现的文件夹文件浏览器)。

我的问题是获取图标。到目前为止,我已经为 Windows API 的一些函数编写了一个包装器 class,特别是 SHGetKnownFolderPathSHGetFileInfo。我的方法如下:

1) 使用SHGetKnownFolderPath 获取相应位置的完整路径(这取决于Windows 版本和本地化)。 这部分工作正常。 例如,在我的系统 (W7 Pro x64) 上,SHGetKnownFolderPath returns "C:\Users\Administrator\Links" 当使用相应的 rfid 查询时。

2) 使用SHGetFileInfo 获取图标,Windows 认为是1) 中获取的路径的默认图标。这部分在技术上也可以工作,但是返回了错误的图标 - 错误是因为它是 Windows 文件资源管理器用于同一位置的另一个图标。

我已经在四个不同的位置(MyLibraries、MyFavorites(链接)、MyComputer、MyNetwork)进行了尝试。 MyLibraries 的图标是预期的图标,其他三个图标与 Windows 文件资源管理器使用的图标完全不同。

所以我有一些问题:

1) 有什么方法可以检测标准 Windows 文件资源管理器对某些文件夹使用了哪些图标,例如"Favorites"(C:\Users\Administrator\Links 在我的机器上)?我会对通用解决方案感兴趣(即适用于所有位置的解决方案 described here)。

2)如果没有这种方法,我会在shell32.dll中找出所有感兴趣的图标的编号(索引)(实际上目前只有几个)。我可以确定这些索引将来不会改变吗?

3) 根据this document,我必须在使用SHGetFileInfo 之前调用CoInitialize。我相信 .NET 框架在启动主线程之前会自动为主线程执行此操作,因此我自己还没有完成(应用程序的开发刚刚开始,目前只有一个线程)。

我认为缺少对 CoInitialize 的调用不可能是 "wrong" 图标的原因。如果我在这里错了,请告诉我。

一个潜在的解决方案可能是使用 .NET 语言或本机 Windows API / SDK。只要有某种方法(即使是极其复杂的方法)可以使用 VB.net 中的解决方案,我都会很高兴。

Explorer 使用 2 种方法检测任何对象、文件或文件夹的图标。

1) 调用 IShellFolder.GetUIObjectOf(IExtractIconA/W) 并使用 IExtractIcon。

2) 查询 IShellFolder.QueryInterface(IShellIcon) 并调用 IShellIcon.GetIconOf.

你也可以这样做。