FILE_ATTRIBUTE_OFFLINE 的动态动词快捷菜单

Shortcut Menu with Dynamic Verbs for FILE_ATTRIBUTE_OFFLINE

我希望通过 QueryContextMenu 方法(动态动词)的快捷菜单对于“占位符”也是可见的。占位符是仅在本地虚拟存在的文件,需要先从云同步提供商下载文件才能读取。

因此,我通过以下方式注册了我的快捷菜单:

HKLM
{
    NoRemove Software
    {
        NoRemove Classes
        {
            NoRemove CLSID
            {
                ForceRemove '%CLSID%' = s '%DESCRIPTION%'
                {
                    InprocServer32 = s '%MODULE%'
                    {
                        val ThreadingModel = s 'Apartment'
                    }
                    SupportedProtocols = s '*'
                    {
                    }
                }
            }
            NoRemove AllSyncRootObjects
            {
                NoRemove ShellEx
                {
                    NoRemove ContextMenuHandlers
                    {
                        ForceRemove '%DESCRIPTION%' = s '%CLSID%'
                    }
                }
            }
        }
    }    
}

如果文件确实存在于本地,将显示我的上下文菜单项。但如果它被脱水(转换为占位符),我的上下文菜单条目将不会显示。如何注册我的 ShellExtension,以便它始终显示?我需要设置哪种标志?可悲的是,互联网对此只字未提。

我试图从 Microsoft 的 ClourMirror 示例中学习,它提供了自定义上下文菜单条目,但遗憾的是它们不起作用:https://github.com/microsoft/Windows-classic-samples/issues/156。同时,我尝试从“始终保留在此设备上”和“释放 space”上下文菜单条目中学习,这些条目使用标志 SkipCloudDownload(值:0)和 StorageProviderFlagsRequired (value:2) 看起来很有前途。尤其是SkipCloudDownload,但是我把这个标志设置在各个位置,没有改变。

在项目的当前状态下,由于跨平台兼容性,需要动态动词。感谢任何提示。

解决方案是向 COM 对象添加空值 'ContextMenuOptIn':

HKLM
{
    NoRemove Software
    {
        NoRemove Classes
        {
            NoRemove CLSID
            {
                ForceRemove '%CLSID%' = s '%DESCRIPTION%'
                {
                    val ContextMenuOptIn= s ''

                    InprocServer32 = s '%MODULE%'
                    {
                        val ThreadingModel = s 'Apartment'
                    }
                }
            }
            NoRemove AllSyncRootObjects
            {
                NoRemove ShellEx
                {
                    NoRemove ContextMenuHandlers
                    {
                        ForceRemove '%DESCRIPTION%' = s '%CLSID%'
                    }
                }
            }
        }
    }    
}

我在这里找到了解决方案:https://github.com/pipeline-foundation/projects/issues/97 他们有几个关于同一问题的问题,可以通过添加额外的 'flag'.

来解决它