Mat*_*ith 4 winapi shell32 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
[HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}\ShellFolder]
"Attributes"=dword:60000000
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\Namespace\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}]
@="My Namespace Extension"
Run Code Online (Sandbox Code Playgroud)
以下 .reg 文件将允许您轻松删除上述注册表项:
Windows Registry Editor Version 5.00
[-HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}]
[-HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\Namespace\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}]
Run Code Online (Sandbox Code Playgroud)此时,当您打开资源管理器窗口并浏览“我的电脑”时,您应该会看到“我的命名空间扩展”。浏览它应该会显示您的 %TEMP% 目录文件夹/文件。
%TEMP%在您的文件夹中创建一个名为 的目录FolderToRemove。在其中FolderToRemove创建一个名为 的子文件夹subFolder。
打开 3 个资源管理器窗口并浏览到以下位置:
在 Windows 7 上,执行以下 C++ 代码:
// This path represents My Computer\My Namespace Extension\FolderToRemove
const wchar_t * pPath = L"::{20d04fe0-3aea-1069-a2d8-08002b30309d}\\::{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}\\FolderToRemove";
SHChangeNotify(SHCNE_RMDIR, SHCNF_PATH, pPath, NULL);
Run Code Online (Sandbox Code Playgroud)执行上述代码后,您会注意到唯一发生更改的资源管理器窗口是最初导航到My Computer\My Namespace Extension\FolderToRemove\subFolder. 请注意,它现在指向My Computer\My Namespace Extension\FolderToRemove:
期望两个资源管理器窗口发生更改,以便它们全部导航到My Computer\My Namespace Extension(已删除文件夹的父文件夹)。下面是预期行为的图像(这是 Windows 10 上发生的情况):

我发现通过在SHChangeNotify. 例如:
// This path represents My Computer\My Namespace Extension
const wchar_t * pPath = L"::{20d04fe0-3aea-1069-a2d8-08002b30309d}\\::{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}";
SHChangeNotify(SHCNE_RMDIR, SHCNF_PATH, pPath, NULL);
Run Code Online (Sandbox Code Playgroud)
但是,当我在 Windows 10 上执行此代码时,它当然会导致窗口导航回My Computer不希望的位置。如果我采用这种解决方法,我将需要针对不同操作系统的不同代码。
作为 Microsoft 支持案例的一部分,我获得了以下信息,其中描述了 Explorer 在此工作流程中的反应。然而,它没有给出任何关于 Windows 10 行为不同的原因:
\n对于导航到 SHCNE_RMDIR 通知或其后代之一中指定的文件夹的任何浏览器窗口,资源管理器会将浏览器窗口导航到有效(祖先)文件夹。从 SCHNE_RMDIR 通知中指定的文件夹的绝对 ITEMIDLIST 开始,确定要在 Explorer 浏览器窗口中打开的新文件夹的过程是:
\n在您发布到 StackOverflow 的重现步骤中,我们打开了资源管理器浏览器窗口并打开了以下文件夹:
\n\n\n::{CLSID_MyComputer}::{CLSID_My 命名空间扩展}
\n::{CLSID_MyComputer}::{CLSID_My 命名空间扩展}\\FolderToRemove
\n::{CLSID_MyComputer}::{CLSID_My 命名空间\n扩展名}\\FolderToRemove\\subFolder
\n
以下是 SHCNE_RMDIR 通知的方式
\n::{CLSID_MyComputer}\\::{CLSID_My Namespace Extension}\\FolderToRemove
文件夹由浏览器窗口处理:
\n浏览器窗口导航至::{CLSID_MyComputer}\\::{CLSID_My Namespace Extension}:
浏览器窗口导航至::{CLSID_MyComputer}\\::{CLSID_My Namespace Extension}\\FolderToRemove
浏览器窗口导航至::{CLSID_MyComputer}\\::{CLSID_My Namespace Extension}\\FolderToRemove\\subFolder
| 归档时间: |
|
| 查看次数: |
545 次 |
| 最近记录: |