在即将推出的(当前内部版本)OneDrive客户端 - 按需功能中,Microsoft引入了一些新的shell /命名空间扩展.
还有一列显示文件可用性状态,以及状态栏中的文本.
Microsoft是否为OneDrive同步文件夹或其他一些shell界面开发了特殊的IShellView实现?他们是如何联系到文件选择更改事件的呢?
我知道自从以前的一些Windows版本以来,对列处理程序扩展的支持已被删除.
请指出一些有关开发此类功能的有用资源:自定义列和状态栏扩展(最好使用C#..).
据我了解,目前有两种方法可以使用资源管理器从 Shell 命名空间扩展复制虚拟文件,以便向用户显示复制 GUI:
通过IDataObject接口:
读取文件是通过至少IDataObject::GetData支持CFSTR_FILEDESCRIPTORW,CFSTR_FILECONTENTS和剪贴板格式来完成的。CFSTR_SHELLIDLIST请求应创建一个用于访问数据的对象CFSTR_FILECONTENTS。当需要时,通过设置标志来启用 UI 。IDataObject::GetDataIStreamFD_PROGRESSUICFSTR_FILEDESCRIPTORW
通过ITransferSource接口:
读取文件是通过ITransferSource::OpenItem请求IShellItemResources. 然后IShellItemResources应将{4F74D1CF-680C-4EA3-8020-4BDA6792DA3C}资源报告为受支持(GUID 指示该项目有一个 IStream)。最后,IStream通过父级请求ShellFolder::BindToObject访问数据。UI 由资源管理器本身处理,它始终显示。
我的问题是:这两种机制单独工作得很好(正如您从屏幕截图中看到的)。但是一旦我启用了IDataObjectfromIShellFolder::GetUIObjectOf和ITransferSourcefrom IShellFolder::CreateViewObject- 总是使用 via 方法IDataObject,导致旧的副本 GUI(如第一个屏幕截图所示)。我从跟踪日志中看到ITransferSource多次请求,但没有执行任何操作,它只是立即释放并销毁。
那么,当从 Shell 命名空间扩展进行复制时,如何强制资源管理器显示精美的复制 GUI?
可以在这里找到最小的可重现示例:https://github.com/BilyakA/SO_73938149
在研究最小可重复示例时,我设法使其在启用IDataObject和ITranfserSource接口的情况下按预期工作。事情发生在之后:
regsvr32 /u …winapi windows-shell shell-extensions shell-namespace-extension
我正在使用SHChangeNotifywithSHCNE_RMDIR通知 shell 已从我的shell 命名空间扩展中删除的文件夹。我的期望是,这将导致任何将其文件夹视图导航到已删除文件夹(或其任何子文件夹)的资源管理器(或其他 shell)窗口导航到已删除文件夹的父文件夹。这种预期行为发生在 Windows 10 上。但是,在 Windows 7 上,这些窗口将导航到已删除的文件夹。
Windows 7 上的这种行为是否是一个错误,和/或者我可以做些什么(无需针对 Windows 7 的特殊代码)来为两个操作系统获得相同的行为?
以下是如何从头开始创建和观察问题的演练。这涉及使用称为Shell 实例对象的“内置”Microsoft 命名空间扩展(而不是我真正的命名空间扩展)。我使用它是为了简单起见,也是为了表明它与我的特定命名空间扩展无关。此示例命名空间扩展所做的全部工作是在“我的电脑”下创建一个图标,该图标将浏览到您的 %TEMP% 目录。
安装命名空间扩展并在“我的电脑”下注册。为此,请在注册表中输入以下内容:
HKEY_CURRENT_USER\Software\Classes\CLSID
{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}=REG_SZ_EXPAND:"My Namespace Extension"
DescriptionID=REG_DWORD:0x00000008
System.IsPinnedToNameSpaceTree=REG_DWORD:0x00000001
DefaultIcon=REG_EXPAND_SZ:"%SystemRoot%\system32\main.cpl,9"
InProcServer32=REG_EXPAND_SZ:"%SystemRoot%\system32\shdocvw.dll"
ThreadingModel=REG_SZ:"Apartment"
ShellFolder
Attributes=REG_DWORD:0x60000000
Instance
CLSID=REG_SZ:"{0AFACED1-E828-11D1-9187-B532F1E9575D}"
InitPropertyBag
Attributes=REG_DWORD:0x00000011
Target=REG_SZ_EXPAND:"%TEMP%"
Run Code Online (Sandbox Code Playgroud)
这是一个 .reg 文件,可以为您自动执行此操作:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}]
@="My Namespace Extension"
"System.IsPinnedToNameSpaceTree"=dword:00000001
"DescriptionID"=dword:00000008
[HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}\DefaultIcon]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,6d,00,61,00,\
69,00,6e,00,2e,00,63,00,70,00,6c,00,2c,00,39,00,00,00
[HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}\InProcServer32]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,73,00,68,00,\
64,00,6f,00,63,00,76,00,77,00,2e,00,64,00,6c,00,6c,00,00,00
"ThreadingModel"="Apartment"
[HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}\Instance]
"CLSID"="{0AFACED1-E828-11D1-9187-B532F1E9575D}"
[HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}\Instance\InitPropertyBag]
"Attributes"=dword:00000011
"Target"=hex(2):25,00,54,00,45,00,4d,00,50,00,25,00,00,00 …Run Code Online (Sandbox Code Playgroud)