1

总而言之,我正在寻找在设备和打印机控制面板文件夹中使用的增强的、照片般逼真的图标。

我想我可以使用 Windows shell 来枚举它们,但是我没有将 shell 包链接到我的 .NET 项目,而且我觉得这是作弊,无论如何(LOL 在这里,取决于你是否愿意欣赏一个)。

我发现的关于在 shell 之外访问这些文件的大多数稀疏文档是通过转到路径“%LOCALAPPDATA%\Microsoft\Device Metadata\dmrccache”

除了,我正在运行 Windows 8.1 Pro,并且该目录不存在。我确实找到了一个名为“C:\Users\Nathan\AppData\Local\Microsoft\Device Stage\Device\{8616C787-FB4C-4B21-A2FE-D263F0DC4DA5}\en-US”的目录

这似乎保存了我的 Brother 多功能打印机的图像,但我找不到其他设备的类似文件夹。更不用说,在注册表中根本找不到 GUID 键 {8616C787-FB4C-4B21-A2FE-D263F0DC4DA5},它也没有链接到我可以找到的与打印机设备关联的任何设备属性...打印机设备也没有设备元数据文件的属性键(说键不存在,尽管填充了所有其他设备信息,但很好。)

我查看了 MSDN,它告诉您所有有关如何创建 OWN 设备阶段和用于设备部署的增强图标 XML 元数据的信息,但在 windows 中几乎没有关于如何消化它的文档。

我对大多数 SetupDiXXXXXX 函数非常熟悉并能胜任工作,并构建了我自己的基于 .NET 的硬件枚举器和围绕这些函数的类。

但是我现在找不到处理我遇到的问题的文档。唯一的“快速修复”解决方案是从设备和打印机文件的外壳枚举中获取图标...

但是我非常想更深入地了解这个问题的内部工作原理,并且通过 shell COM 接口不是我的首选解决方案(我确实使用 shell C API 函数,但是,如果有人可以提供与此相关的答案,我全神贯注)。

另外,我想知道为什么以及是否设备阶段层以某种方式从 Windows 7 更改为 Windows 8,以及为什么没有记录在案。

附录

我不介意使用 shell 图标提取,如果我能弄清楚如何通过计算它来获取文件本身的名称,如果它甚至存在,在这样的目录中。

要访问设备和打印机,神奇的名称是:

::{26EE0668-A00A-44D7-9371-BEB064C98683}\0\::{A8A91A66-3A7D-4424-8D24-04E180695C7A}

如果您将其粘贴在您的资源管理器浏览器栏中,它将带您到那里。如果可以获取附加到该路径的信息,我可以使用 shell C 调用来获取图标。

但是尝试打印机的实例 ID 不起作用(它适用于网络文件夹)。

我什至不知道在这样的文件夹中是否有可能。

尽管如此,我还是想知道更多关于如何去寻找这些东西的信息,我自己。

4

1 回答 1

0

好的。我做了一些挖掘,可以在不借助 shell 接口的情况下获取设备的图标。

给定设备和打印机文件夹的基本路径:

::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\::{A8A91A66-3A7D-4424-8D24-04E180695C7A}

做作业我发现你所要做的就是添加:

\Provider%5CMicrosoft.Base.DevQueryObjects//DDO:

到基本路径的末尾,后跟设备 ContainerId 的 URL 转义版本,由 SetupDiXXXX 函数检索。从那里您可以检索照片般逼真的图标。

我已经做到了,并且有效。只需找到设备的容器 ID,将此数据传递给 SHParseDisplayName,然后从那里您可以从项目图像列表中获取图标。

但是我仍然想知道为什么很难找到有关消费设备阶段信息数据的信息。

此外,在 x64 系统上为 x86 编译时, SHParseDisplayName不能与“非常特殊”的文件夹一起正常工作......到目前为止,我只能通过专门为 x64 编译来检索具有上述公式的特殊照片般逼真的图标。我要去一台实际的 x86 机器,看看我是否得到类似的反应。

于 2014-09-20T05:55:38.983 回答