FILE_ATTRIBUTE_OFFLINE占位符文件动态动词快捷菜单显示问题咨询
同步根占位符上下文菜单显示修复方案
- 此方案完全兼容基于
QueryContextMenu的动态动词实现,无需调整现有动词生成逻辑,仅需修改注册配置与元数据读取规则即可生效。
1. 核心修改点
注册表注册配置调整
你需要在两处位置补充添加标志配置,仅单处设置不会生效:
- 你自定义扩展的CLSID节点下新增
ShellEx/ContextMenuHandler子节点,添加两个DWORD值 AllSyncRootObjects/ShellEx/ContextMenuHandlers下你的扩展注册项同步添加相同标志- 可选补充注册到所有文件和目录节点,覆盖未被识别为同步根对象的占位符场景
修正后的完整注册表注册片段如下:
HKLM { NoRemove Software { NoRemove Classes { NoRemove CLSID { ForceRemove '%CLSID%' = s '%DESCRIPTION%' { InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' } SupportedProtocols = s '*' NoRemove ShellEx { NoRemove ContextMenuHandler { val SkipCloudDownload = d '0' val StorageProviderFlagsRequired = d '2' } } } } NoRemove AllSyncRootObjects { NoRemove ShellEx { NoRemove ContextMenuHandlers { ForceRemove '%DESCRIPTION%' = s '%CLSID%' { val SkipCloudDownload = d '0' val StorageProviderFlagsRequired = d '2' } } } } // 可选补充注册,避免部分场景下同步根标记未被识别 NoRemove * { NoRemove ShellEx { NoRemove ContextMenuHandlers { ForceRemove '%DESCRIPTION%' = s '%CLSID%' } } } NoRemove Directory { NoRemove ShellEx { NoRemove ContextMenuHandlers { ForceRemove '%DESCRIPTION%' = s '%CLSID%' } } } } } }
2. QueryContextMenu逻辑兼容
- 不要在
QueryContextMenu执行阶段调用CreateFile等触发文件内容读取的API,仅通过IShellItem/IShellItem2接口获取文件的元数据、同步状态属性即可 - 如需判断文件是占位符还是本地实体文件,可通过
IShellItem2.GetUInt32读取PKEY_StorageProviderState属性判断,不会触发占位符的自动下载逻辑
3. 可选打包兼容
如果你的扩展通过MSIX/Appx打包分发,需要在包清单的桌面Shell扩展声明中同步添加上述两个标志的配置,打包场景下注册表配置优先级低于包清单声明。
内容的提问来源于stack exchange,提问作者Trafo
相关产品推荐
相关产品推荐

