2017-12-14 74 views
1

現在、私のプロパティハンドラは、WindowsエクスプローラのカラムStringに表示できるプロパティを提供しています。私の目標は、(表示)タイプアイコンのプロパティでハンドラを拡張することです。これは、Windowsエクスプローラの詳細ビューに列として追加できます。この列には、各ファイル項目のアイコンが表示されます。 g。アイコンはいくつかの可能な状態のうちファイルの特定の状態を表すことができる。WindowsプロパティシステムでIconListプロパティを作成する方法は?

しかし、これらの特性を持つプロパティをWindowsプロパティシステムのベースに正しく作成するために必要な部分を組み立てることはできませんでした。

私のアプローチの最初のステップは、.propdescファイルでプロパティのXMLを指定してから、通常のPSRegisterPropertySchema登録プロセスを実行することです。これは常に正常に実行され、プロパティはWindowsプロパティシステムに一覧表示されます。 <displayInfo>タグ内のタイプ"IconList"control属性を持つ

<propertyDescription name="myprop.icon" formatID="{c5f47221-1053-4a75-aadc-0bfbac1c3e9c}" propID="444"> 
    <typeInfo type="???" isInnate="true" isViewable="true"/> 
    <labelInfo label="MyProp-Icon"/> 
    <displayInfo defaultColumnWidth="25" alignment="Center"> 
     <drawControl control="IconList"/> 
    </displayInfo> 
</propertyDescription> 

<drawControl>drawControl)の存在は、私は私のアイデアが実現可能であることができることを感じさせます。

しかし、対応するtype<typeInfo>タグ(typeInfo)に設定するにはどうすればよいですか? control="IconList"のコンセプトに応じて、これはインデックスとしての整数かもしれません イメージリストのようなものです。または、画像自体を表す"Buffer","Blob"または"Stream"ですか?

PROPVARIANT.propdescファイルのプロパティの説明に従って初期化する必要があるプロパティハンドラのシェル拡張のGetValue()方法で最終:"IconList"のためにこれを行う方法を、再び

HRESULT PropertyHandler::GetValue (REFPROPERTYKEY key, PROPVARIANT *pPropVar) 
{ 
    HRESULT hr = ERROR_NOT_FOUND; 

    if (key.pid == 444) 
    { 
     // How to initialize pPropVar in case of control="IconList"? 
    } 
    else 
    { 
     // String example 
     hr = InitPropVariantFromString (L"Some Text", pPropVar); 
    } 

    return hr; 
} 

プロパティ?

XML仕様とPROPVARIANT初期設定の間の正確な一致を見つけるたびに、Windows Explorerの対応する列が空白になります。

IconList<drawControl>のプロパティを既に実装している人はいますか?

答えて

2

propsys.dllにWINDOWSPROPERTYDESCRIPTIONSリソースがあります。このリソースは、すべてのシステム・プロップを記述します。いくつかのプロパティは、IconListと等しいdrawcontrolを持っています。例:

<propertyDescription name="System.StorageProviderUIStatus" formatID="{E77E90DF-6271-4F5B-834F-2DD1F245DDA4}" propID="2"> 
    <searchInfo reIndexPatterns="" processReIndexPatternsImmediately="true" inInvertedIndex="false" isColumn="false"> 
    </searchInfo> 
    <typeInfo type="Blob" isInnate="true" isViewable="true"> 
    </typeInfo> 
    <labelInfo label="@propsys.dll,-42289"> 
    </labelInfo> 
    <displayInfo defaultColumnWidth="10"> 
    <drawControl control="IconList"> 
    </drawControl> 
    </displayInfo> 
</propertyDescription> 

このようなすべての小道具は、すべて「Blob」に等しいタイプです。だからブロブは答えです。

更新

私の小さな調査。

アイコンを表示する唯一の既知の(私による)ハンドラはOneDriveです。スクリーンショット:

enter image description here

私はシステムの値を得ました。OneDriveファイルのStorageProviderUIStatusプロパティ。バリュー・ダンプ:

enter image description here

見ての通り、これは画像やアイコンではありません。これは[MS-PROPSTORE]で説明されているプロパティストアバイナリファイルです。デコード形式:

System.PropList.StatusIcons = prop:System.StorageProviderState;System.StorageProviderCustomStates 
System.PropList.StatusIconsDisplayFlag = 3 
StorageProviderState = 2 
StorageProviderCustomStates = (binary data) 

埋め込みプロパティストアバイナリファイルのバイナリデータ。そのデコードされた形式:

StorageProviderFullyQualifiedId = OneDrive!S-1-5-21-782054983-1121033576-3753986437-1001!Personal|79D9464945C2A3B2!331 

シンプルなアイコンの説明はすべて非常に困難です。そして、多分私は間違っているかもしれないし、ブロブのタイプは唯一の答えではありません。 propdescファイルの

SOLUTION

内容:

<propertyDescription name="DummyUIState" formatID="{8A560909-320E-4E6A-A6C4-A95C50B77084}" propID="5001"> 
    <searchInfo columnIndexType="NotIndexed"/> 
    <labelInfo label="DummyUIState"/> 
    <typeInfo type="Blob" isInnate="true" isViewable="true"/> 
    <displayInfo defaultColumnWidth="10"> 
    <drawControl control="IconList"/> 
    </displayInfo> 
</propertyDescription> 

<propertyDescription name="DummyState" formatID="{8A560909-320E-4E6A-A6C4-A95C50B77084}" propID="5000"> 
    <searchInfo columnIndexType="NotIndexed"/> 
    <labelInfo label="DummyState"/> 
    <typeInfo type="UInt32" isInnate="true" isViewable="true"/> 
    <displayInfo displayType="Enumerated"> 
    <enumeratedList> 
     <enum name="None" value="0" text="@propsys.dll,-42290"/> 
     <enum name="Sparse" value="1" text="@propsys.dll,-42291"> 
     <image res="%systemroot%\system32\imageres.dll,-1404"/> 
     </enum> 
     <enum name="InSync" value="2" text="@propsys.dll,-42292"> 
     <image res="%systemroot%\system32\imageres.dll,-1400"/> 
     </enum> 
     <enum name="Pinned" value="3" text="@propsys.dll,-42293"> 
     <image res="%systemroot%\system32\imageres.dll,-1405"/> 
     </enum> 
     <enum name="PendingUpload" value="4" text="@propsys.dll,-42294"> 
     <image res="%systemroot%\system32\imageres.dll,-1401"/> 
     </enum> 
     <enum name="PendingDownload" value="5" text="@propsys.dll,-42303"> 
     <image res="%systemroot%\system32\imageres.dll,-1401"/> 
     </enum> 
     <enum name="Transferring" value="6" text="@propsys.dll,-42296"> 
     <image res="%systemroot%\system32\imageres.dll,-1401"/> 
     </enum> 
     <enum name="Error" value="7" text="@propsys.dll,-42315"> 
     <image res="%systemroot%\system32\imageres.dll,-1402"/> 
     </enum> 
     <enum name="Warning" value="8" text="@propsys.dll,-42316"> 
     <image res="%systemroot%\system32\imageres.dll,-1403"/> 
     </enum> 
     <enum name="Excluded" value="9" text="@propsys.dll,-42319"/> 
     <enum name="Pending" value="10" text="@propsys.dll,-42324"> 
     <image res="%systemroot%\system32\imageres.dll,-1401"/> 
     </enum> 
    </enumeratedList> 
    </displayInfo> 
</propertyDescription> 

するときは、プロパティストアバイナリファイルとBLOBを作成する必要がありますDummyUIStateシェル要求。

  1. キーSystem.PropList.StatusIcons、小道具に等しい型VT_LPWSTRと値:DummyState
  2. キーSystem.PropList.StatusIconsDisplayFlag、2に等しいタイプのVT_UI4を持つ値(プロパティストアバイナリファイルには以下のデータが含まれている必要があります2 - アイコンのみ、1 - アイコン+テキスト)
  3. キーDummyState、値タイプVT_UI4。この値はアイコンを定義します。

それだけです。 Windowsの10のスクリーンショットでテスト:

enter image description here

+0

どうもありがとう、ブロブは間違いなく正しいです。私は 'pPropVar-> blob.pBlobData'を予期されたデータ(画像)形式に設定しています。私は 'HBITMAP'をデータ自体として試しました。これは、' GetDIBits() 'によってビットマップから抽出されたバイト配列と、BMP、PNG、ICOファイルのファイル内容のバイト配列です。残念ながら、アイコンの列はこれらのすべての組み合わせで空白のままです。 –

+0

非常に興味深く神秘的です。 'propsys.dll'のリソースに関するヒントは' System.OfflineStatus'のようなプロパティにつながります。 'enumeratedList>の' displayType = "Enumerated"と ''には、DLL内のイメージリソースを参照する ''タグが含まれています。これは完全に合理的な音と私はそのようなプロパティを構築したが、残念ながら画像は表示されません。代わりに、列には ''タグでも指定されているテキストリソースが表示されます。ここでは、Blobパスをさらに追跡して、Property Store Binary Fileの形式を理解しようとします。 –

+0

実際には、今までWindowsエクスプローラの列には、ファイルアイコン以外のアプリケーションは表示されませんでした。 OneDriveでも私のシステムにはアイコンのプロパティはありません。アイコンプロパティを実装することは不可能かもしれないと私は思う。あなたの調査のために大変ありがとう! –

関連する問題