2017-12-14 43 views
1

현재 내 속성 핸들러는 String 유형의 Windows 탐색기 열에 표시 할 수있는 속성을 제공합니다. 내 목표는 (디스플레이) 유형 아이콘의 속성으로 처리기를 확장하여 Windows 탐색기의 세부 정보보기에 열로 추가 할 수 있습니다. 이 열에는 각 파일 항목에 대한 아이콘이 표시되어야합니다 (예 : 지. 아이콘은 여러 가능한 상태 중 파일의 특정 상태를 나타낼 수 있습니다.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)의 존재는 내 아이디어가 실현 될 수 있다고 생각한다.

그러나 을 <typeInfo> 태그 (typeInfo)에 어떻게 설정합니까? control="IconList"의 개념에 따라 인덱스 과 같은 정수로 약간의 이미지 목록이 될 수 있습니다. 또는 이미지 자체를 나타내는 "Buffer", "Blob" 또는 "Stream"입니까?

마지막으로, PROPVARIANT.propdesc 파일의 속성 설명에 따라 초기화하는 속성 처리기 셸 확장의 GetValue() 방법 : 다시

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; 
} 

, "IconList"이 작업을 수행하는 방법 속성?

XML 사양과 PROPVARIANT 초기화 간의 정확한 일치를 찾으려고 할 때마다 Windows 탐색기의 해당 열이 비어 있습니다.

이미 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> 

이러한 모든 props는 "Blob"과 동일한 유형입니다. Blob은 답입니다.

업데이트

내 작은 조사.

아이콘을 표시하는 유일한 핸들러는 OneDrive입니다. 스크린 샷 :

enter image description here

나는 시스템의 값을 얻었다.OneDrive 파일 중 하나의 StorageProviderUIStatus 속성입니다. 값 덤프 :

enter image description here

보시다시피이 이미지 나 아이콘이 아닙니다. 이것은 [MS-PROPSTORE]에 설명 된 Property Store Binary File입니다. 디코딩 형식 :

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 

간단한 아이콘 설명은 모두 매우 어려워 보입니다. 그리고 아마도 나는 틀렸고 Blob 타입 만이 유일한 대답이 아닙니다. propdesc 파일의

솔루션

내용 :

<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> 

때 부동산 스토어 바이너리 파일과 방울을 만들어야합니다 DummyUIState 쉘 요청. 소품 동일한 유형의 VT_LPWSTR와

  1. 키 System.PropList.StatusIcons, 값 : : 부동산 스토어 바이너리 파일은 다음과 같은 데이터를 포함해야 DummyState을
  2. 키 System.PropList.StatusIconsDisplayFlag, 2와 동일한 유형의 VT_UI4와 값 (2 - 아이콘 만, 1 - 아이콘 + 텍스트)
  3. 키 DummyState, 값 유형 VT_UI4. 이 값은 아이콘을 정의합니다.

그게 전부입니다. 윈도우 (10) 스크린 샷에서 테스트 :

enter image description here

+0

덕분에 많이, 물방울은 확실히 맞습니다. 나는 여전히'pPropVar-> blob.pBlobData'를 예상 된 데이터 (이미지) 포맷으로 설정하는데 어려움을 겪고있다. 나는 비트 맵에서'GetDIBits()'에 의해 추출 된 바이트 배열과 BMP, PNG, ICO 파일의 파일 내용의 바이트 배열 인 데이터 자체로서'HBITMAP'을 시도했다. 불행히도 아이콘 조합은 이러한 모든 조합에서 여전히 비어 있습니다. –

+0

매우 흥미롭고 신비 롭습니다. 'propsys.dll'에있는 리소스에 관한 힌트는'System.OfflineStatus'와 같은 속성으로 연결됩니다. 'displayType = "Enumerated"와''의''은 DLL의 이미지 자원을 참조하는'' 태그를 포함합니다. 이것은 완전히 합리적으로 들리고 그런 속성을 만들었지 만 불행히도 이미지는 결코 표시되지 않습니다. 대신 칼럼에는''태그에 지정된 텍스트 리소스가 표시됩니다. 이제 Blob 경로를 자세히 추적하고 Property Store Binary File 형식을 이해하려고 시도합니다. –

+0

사실 지금까지는 파일 아이콘을 제외한 모든 응용 프로그램에서 Windows 탐색기 열에 아이콘이 표시되지 않았습니다. 심지어 OneDrive는 내 시스템에 아이콘 속성을 제공하지 않습니다. 아이콘 속성을 구현하는 것이 불가능할 수도 있습니다. 조사해 주셔서 대단히 감사합니다! –

관련 문제