总而言之,我正在寻找在设备和打印机控制面板文件夹中使用的增强的、照片般逼真的图标。
我想我可以使用 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 不起作用(它适用于网络文件夹)。
我什至不知道在这样的文件夹中是否有可能。
尽管如此,我还是想知道更多关于如何去寻找这些东西的信息,我自己。