设备阶段和设备元数据:找不到答案

时间:2014-09-20 00:16:41

标签: .net winapi icons device controlpanel

短缺的是,我正在寻找“设备和打印机”控制面板文件夹中使用的增强的照片般逼真的图标。

我想我可以使用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枚举中获取图标......

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

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

附录

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

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

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

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

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

我甚至不知道在这样的文件夹中是否可以。

不过,我想知道更多关于如何去找这些东西,我自己。

1 个答案:

答案 0 :(得分:0)

好。我做了一些挖掘,并且可以获得设备的图标而无需借助shell接口。

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

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

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

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

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

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

HOWEVER 我仍然想知道为什么要找到有关消耗设备阶段信息数据的信息这么难。

另外在x64系统上编译x86时,SHParseDisplayName无法正常使用“极其特殊”的文件夹...到目前为止,我只能通过上面的公式检索特殊的照片般逼真的图标特别是为x64编译。我将去一个真正的x86机器,看看我是否得到了类似的反应。