1

要するに、デバイスとプリンターのコントロール パネル フォルダーで使用されている、拡張された写真のようにリアルなアイコンを探しているということです。

Windowsシェルを使用してそれらを列挙できると思いますが、.NETプロジェクトにリンクされたシェルパックを持っていません.とにかく、それは不正行為だと思います.感謝します)。

シェルの外部でこれらのファイルにアクセスすることに関して私が見つけたまばらなドキュメントのほとんどは、パス「%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」というディレクトリが見つかりました

これには、ブラザー複合機の画像が保持されているようですが、他のデバイス用の同様のフォルダーは見つかりません。言うまでもなく、GUID キー {8616C787-FB4C-4B21-A2FE-D263F0DC4DA5} はレジストリにまったく見つかりません。また、プリンター デバイスに関連付けられているデバイス プロパティにもリンクされていません。また、プリンター デバイスには、デバイス メタデータ ファイルのプロパティ キーがありません (他のすべてのデバイス情報が読み込まれますが、キーは存在しないと言います)。

MSDN を見たところ、独自のデバイス ステージとデバイス展開用の拡張アイコン XML メタデータを作成する方法がすべて説明されていますが、Windows でそれを消化する方法に関するドキュメントはほとんどありません。

私は、ほとんどの SetupDiXXXXXX 関数に精通しており、十分に機能しており、これらの関数をラップする独自の .NET ベースのハードウェア 列挙子とクラスを作成しました。

しかし、現在、私が抱えている問題を扱っているドキュメントは見つかりません。唯一の「クイックフィックス」ソリューションは、デバイスとプリンターファイルのシェル列挙からアイコンを取得することです...

しかし、私はこの問題の内部の仕組みをより深く理解したいと思っており、シェル COM インターフェイスを使用することは、私の最初の解決策ではありません (ただし、シェル C API 関数をかなり使用します。誰かがそれに関連する答えを提供できます、私はすべて耳です)。

また、デバイス ステージ レイヤーが Windows 7 から Windows 8 に何らかの形で変更された理由とその場合、およびこれが文書化されていない理由を知りたいです。

補遺

そのようなディレクトリにファイルが存在する場合でも、ファイル自体の名前を計算して取得する方法を理解できれば、シェルアイコン抽出を使用してもかまいません。

デバイスとプリンターにアクセスするための魔法の名前は次のとおりです。

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

エクスプローラーのブラウザー バーに貼り付けると、そこに移動します。そのパスにアタッチする情報を取得できる場合は、シェル C 呼び出しを使用してアイコンを取得できます。

しかし、プリンターのインスタンス ID を試してもうまくいきませんでした (ネットワーク フォルダーで機能します)。

このようなフォルダで可能かどうかさえわかりません。

それでも、自分でこれらのものを見つけに行く方法についてもっと知りたいです。

4

1 に答える 1

0

わかった。掘り下げてみたところ、シェル インターフェイスに頼らずにデバイスのアイコンを取得することが可能です。

デバイスとプリンター フォルダーへの基本パスを指定すると、次のようになります。

::{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 に渡すだけで、そこからアイテムの画像リストからアイコンを取得できます。

ただし、デバイス ステージ情報データの消費に関する情報を見つけるのが非常に難しい理由を知りたいと思います。

さらに、x64 システムで x86 用にコンパイルする場合、 SHParseDisplayNameは「非常に特別な」フォルダーでは正しく機能しません。実際の x86 マシンに行って、同様の反応が得られるかどうかを確認します。

于 2014-09-20T05:55:38.983 に答える