c – 如何在Windows Property System中创建IconList属性?
作者:互联网
目前,我的属性处理程序提供了可以在String类型的Windows资源管理器列中显示的属性.我的目标是通过(显示)类型Icon的属性扩展处理程序,可以将其作为列添加到Windows资源管理器的详细信息视图中.在此列中,应显示每个文件项的图标,例如: G.该图标可以表示几种可能状态中文件的特定状态.
但是,我没有设法正确地在Windows Property System的基础上组装创建具有这些特性的属性的必要部分.
我的方法的第一步是在.propdesc文件中为属性指定XML,然后通过通常的PSRegisterPropertySchema注册过程.这始终成功运行,并且该属性在Windows Property System中列出.
<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)在< displayInfo>内具有类型“IconList”的控制属性.标签让我觉得我的想法是可行的.
但是如何在< typeInfo>中设置相应的类型标签(typeInfo)?根据control =“IconList”的概念,这可以是整数作为索引
有点像图像列表.或者它是代表图像本身的“缓冲区”,“Blob”或“流”?
最后,在Property Handler shell扩展的GetValue()方法中,必须根据.propdesc文件的属性描述初始化PROPVARIANT:
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资源管理器中的相应列保持空白.
是否有人已经使用< drawControl>实现了一个属性? IconList类型?
解决方法:
在propsys.dll中有WINDOWSPROPERTYDESCRIPTIONS资源.此资源描述所有系统道具.一些属性的drawcontrol等于IconList.例:
<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”.所以Blob回答了.
更新
我的小调查.
显示图标的唯一已知(由我)处理程序是OneDrive.截图:
我获得了OneDrive文件之一的System.StorageProviderUIStatus属性的值.价值转储:
如您所见,这不是图像或图标.这是[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
对于简单的图标描述,一切看起来都很难.也许我错了,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>
当shell请求DummyUIState时,您必须使用Property Store二进制文件创建blob.属性存储二进制文件必须包含以下数据:
> Key System.PropList.StatusIcons,类型VT_LPWSTR等于prop:DummyState的值
> Key System.PropList.StatusIconsDisplayFlag,类型VT_UI4等于2的值(2 – 仅图标,1 – 图标文本)
> Key DummyState,值类型VT_UI4.该值定义图标.
就这样.在Windows 10上测试过.截图:
标签:windows-shell,c,com,shell-extensions 来源: https://codeday.me/bug/20191006/1858664.html