0

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

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

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

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

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

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

所以我有一些问题

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

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

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

我认为丢失的呼叫CoInitialize不能成为“错误”图标的原因。如果我在这里错了,请告诉我。

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

4

1 回答 1

3

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

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

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

你也可以做到的。

于 2016-11-03T18:58:11.397 回答