什么是 Windows Shell
Windows Shell 是 Windows 操作系统的用户界面。具体地说,用户在登录后看到的桌面、开始菜单、任务栏,以及打开资源管理器看到的操作界面都属于 Windows Shell 的一部分。Windows Shell 实现了一套树形组织结构,称作 Shell Namespace。它包含两种基础对象,即「文件」和「文件夹」, 「桌面」是 Shell Namespace 的根对象。
文件夹是 Shell Namespace 树中的节点和容器,它可以包含子文件夹对象和文件对象。Shell Namespace 中的对象可以表示文件系统对象,也可以是虚拟对象,例如,控制面板、回收站、我的电脑(此电脑)、桌面、网络等对象。这些特殊的虚拟文件夹称作 Shell Folder。
Shell Folder
Windows 除了系统自带的 Shell Folder 外,还可以通过安装 Shell 扩展实现第三方自定义的 Shell Folder。比如,系统安装某些网盘软件后,会在「桌面」或「我的电脑」中添加网盘的 Shell Folder。
可以在下列注册表位置查看系统中的 Shell Folder:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
或者通过工具 ShellExView 来查看:
Windows 系统中每个 Shell Folder 都在注册表中对应形如 HKEY_CLASSES_ROOT\CLSID\{CLSID}\ShellFolder
的项。其中 {CLSID}
即为该 Shell Folder 的 CLSID 值。比如 One Drive 的 Shell Folder 对应的注册表项为 HKEY_CLASSES_ROOT\CLSID\{018D5C66-4533-4307-9B53-224DE2ED1FE6}\ShellFolder
。
Directory 和 Folder 的区别
Directory 和 Folder 是 Windows Shell 中两个比较容易混淆的术语。一般将前者翻译为「目录」,将后者翻译为「文件夹」。两者在注册表中的 ProgID 分别对应 HKEY_CLASSES_ROOT\Directory
和 HKEY_CLASSES_ROOT\Folder
。Directory 对应于文件系统中的除磁盘根目录以外的路径(磁盘对应的 ProgID 为 HKEY_CLASSES_ROOT\Drive
);而 Folder 则表示所有的 Shell Folder。
Shell Folder 挂载位置
Shell Folder 一般会挂载于某个 Shell Namespace 下,比如,桌面、控制面板、我的电脑等。可以通过修改注册表,将 Shell Folder 从这些地方移除。下面列出部分 Shell Folder 挂载点。特别地,对于注册表 HKEY_CURRENT_USER
分支下的项目,一般都会对应 HKEY_LOCAL_MACHINE
分支下相同路径的版本。
我的电脑
即 Win 10 系统上的「此电脑」。对应注册表路径:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{CLSID}
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{CLSID}
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{CLSID}
系统默认自带的 Shell Folder 保存在 HKLM 对应的分支下,Wow6432Node 分支是针对 32 位系统的。「此电脑」挂载的 Shell Folder 主要有:
- 下载:{088e3905-0323-4b02-9826-5d99428e115f}
- 图片:{24ad3ad4-a569-4530-98e1-ab02f9417aa8}
- 音乐:{3dfdf296-dbec-4fb4-81d1-6a3438bcf4de}
- 桌面:{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}
- 文档:{d3162b92-9365-467a-956b-92703aca08af}
- 视频:{f86fa3ab-70d2-4fc7-9c99-fcbf05467f3a}
- 3D 对象:{0DB7E03F-FC29-4DC6-9020-FF41B59E513A}
如果我们要从「此电脑」中移除 Shell Folder,只要将对应的注册表项删除或重命名即可。例如,从「此电脑」中移除「3D 对象」,将 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{0DB7E03F-FC29-4DC6-9020-FF41B59E513A}
删除,或重命名为 {0DB7E03F-FC29-4DC6-9020-FF41B59E513A}.disabled
皆可。
桌面
此处的「桌面」是指 Windows Shell 的根节点,和通过「此电脑」访问到的「桌面」文件夹并不相同。在 Win 10 系统上,资源管理器的左侧导航窗格中默认不显示此「桌面」,可以在菜单「查看」-「导航窗格」下拉菜单中勾选「显示所有文件夹」,来显示此「桌面」。
对应注册表路径为:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{CLSID}
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{CLSID}
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{CLSID}
控制面板
对应注册表路径 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ContorlPanel\NameSpace\{CLSID}
。
快速访问
在 Win 10 中,「快速访问」是打开资源管理器默认显示的 Shell Folder。在该界面下会展示「常用文件夹」和「最近使用的文件」两组列表。可以修改注册表禁用该项功能。
注册表路径 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\HomeFolderDesktop\NameSpace\DelegateFolders
,将该路径下的 {3134ef9c-6b18-4996-ad04-ed5912e00eb5}
和 {3936E9E4-D92C-4EEE-A85A-BC16D5EA0819}
删除即可。
为了便于日后恢复,建议采用重命名的方式。可以将 {3134ef9c-6b18-4996-ad04-ed5912e00eb5}
和 {3936E9E4-D92C-4EEE-A85A-BC16D5EA0819}
改名为 {3134ef9c-6b18-4996-ad04-ed5912e00eb5}.disabled
和 {3936E9E4-D92C-4EEE-A85A-BC16D5EA0819}.disabled
。想要恢复功能,将项目名称后的 .disabled
后缀去除即可。
另外,可以修改注册表隐藏资源管理器导航窗格中的快速访问:在注册表分支 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer
下新建 DWORD 值,命名为 HubMode
,值设为 1。
用户目录
即 %UserProfile%
路径。对应注册表路径 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\UsersFiles\NameSpace\{CLSID}
。
资源管理器导航窗格
以 One Drive 为例,其 Shell Folder 的 CLSID 为 {018D5C66-4533-4307-9B53-224DE2ED1FE6}
。定位注册表路径 HKEY_CLASSES_ROOT\CLSID\{018D5C66-4533-4307-9B53-224DE2ED1FE6}
,将该项下的 System.IsPinnedToNameSpaceTree
键值改为 0 即可。
可以隐藏的 Shell Folder 有:
- 库:{031E4825-7B94-4dc3-B131-E946B44C8DD5}
- One Drive:{018D5C66-4533-4307-9B53-224DE2ED1FE6}
创建自定义 Shell Folder
可以使用 reg 命令操作注册表的方式,在 Shell Namespace 中创建自定义的 Shell Folder。
生成 Shell Folder 的 CLSID
创建 Shell Folder 前首先需要一个 GUID 作为 CLSID。可以通过以下几种方式来生成:
- 在线工具
- Windows SDK 自带的 uuidgen.exe 命令
- VisualStudio 自带的 guidgen.exe 工具
假设生成的 CLSID 为 {0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3}
。
定义 Shell Folder 名称
假设要创建的 Shell Folder 名称是 我的文件夹
:
reg add HKCU\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3} /ve /t REG_SZ /d "我的文件夹" /f
定义 Shell Folder 图标
需要提供 Shell Folder 的图标,可以是 .ico 图标,也可以是可执行文件中的图标资源。这里使用系统的 imageres.dll 中的图标:
reg add HKCU\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3}\DefaultIcon /ve /t REG_EXPAND_SZ /d "%SystemRoot%\system32\imageres.dll,-123" /f
在资源管理器的导航窗格中显示
reg add HKCU\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3} /v System.IsPinnedToNameSpaceTree /t REG_DWORD /d 0x1 /f
0x1
表示显示,0
表示不显示。
定义排序位置
reg add HKCU\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3} /v SortOrderIndex /t REG_DWORD /d 0x42 /f
设置的 SortOrderIndex
值越大,排位越靠后。
在「此电脑」文件夹一栏中显示
reg add HKCU\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3} /v DescriptionID /t REG_DWORD /d 0x03 /f
如果不添加该键值,默认显示在「设备和驱动器」一栏。
设置杂项
reg add HKCU\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3}\InProcServer32 /ve /t REG_EXPAND_SZ /d "%systemroot%\system32\shell32.dll" /f
reg add HKCU\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3}\Instance /v CLSID /t REG_SZ /d {0E5AAE11-A475-4c5b-AB00-C66DE400274E} /f
reg add HKCU\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3}\Instance\InitPropertyBag /v Attributes /t REG_DWORD /d 0x11 /f
reg add HKCU\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3}\ShellFolder /v FolderValueFlags /t REG_DWORD /d 0x28 /f
reg add HKCU\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3}\ShellFolder /v Attributes /t REG_DWORD /d 0xF080004D /f
设置文件夹映射路径
reg add HKCU\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3}\Instance\InitPropertyBag /v TargetFolderPath /t REG_EXPAND_SZ /d "%USERPROFILE%" /f
此处将文件夹路径映射到 %USERPROFILE%
,可以改成其他路径。
添加到「桌面」
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3} /ve /t REG_SZ /d "我的文件夹" /f
添加到「此电脑」
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E3} /ve /t REG_SZ /d "我的文件夹" /f
访问 Shell Folder
通常,用户只能通过 Shell Folder 挂载的 Shell Namespace 来访问它们。不过还有其他方式能直接访问 Shell Folder。
Shell Folder Shortcut
在 Windows Shell 中可以通过 Shell Folder Shortcut 来访问 Shell Folder。Shell Folder Shortcut 的格式为 shell:[FolderName]
,其中 [FolderName]
是 Shell Folder 的 Shortcut 名称。比如系统「发送到」文件夹的 Shell Folder Shortcut 为 shell:SendTo
。
可以通过以下几种方式运行 Shell Folder Shortcut(以 shell:SendTo
为例):
- Win+R 运行
shell:SendTo
- 命令行运行
explorer shell:SendTo
- 新建快捷方式
%windir%\explorer.exe shell:SendTo
- 资源管理器地址栏输入
shell:SendTo
在注册表路径 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions
下保存着所有的 Shell Folder 的 CLSID。每个 CLSID 项下的 Name 键就是该 Shell Folder 的 Shortcut 名称。不过要注意的是,并非所有该路径下的项目都可以通过 Shell Folder Shortcut 来访问,某些项的路径并不存在。
此外,对于包含 ParsingName 键的项,还能通过 shell:[ParsingName]
的格式来访问 Shell Folder。例如上图中 MyComputerFolder
文件夹的 ParsingName 为 ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}
,那么 shell:MyComputerFolder
等同于 shell:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}
。
特殊命名的文件夹
新建一个文件夹,并将其重命名为 此电脑.{20D04FE0-3AEA-1069-A2D8-08002B30309D}
格式,就可以在当前路径下创建「此电脑」的快捷方式。这种方式并非对所有的 Shell Folder 都有效,还是取决于 Shell Folder 的属性。
下面是一些常用的 Shell Folder 命名:
此电脑.{20D04FE0-3AEA-1069-A2D8-08002B30309D}
完全控制面板.{ED7BA470-8E54-465E-825C-99712043E01C}
(又名「上帝模式」)网上邻居.{208D2C60-3AEA-1069-A2D7-08002B30309D}
库.{031E4825-7B94-4dc3-B131-E946B44C8DD5}
当前用户.{59031a47-3f72-44a7-89c5-5595fe6b30ee}
搜索结果.{9343812e-1c37-4a49-a12e-4b2d810d956b}
家庭组.{B4FB3F98-C1EA-428d-A78A-D1F5659CBA93}
网络.{F02C1A0D-BE21-4350-88B0-7367FC96EF3C}
本地图片.{24ad3ad4-a569-4530-98e1-ab02f9417aa8}
我的图片.{3ADD1653-EB32-4CB0-BBD7-DFA0ABB5ACCA}
本地视频.{f86fa3ab-70d2-4fc7-9c99-fcbf05467f3a}
我的视频.{A0953C92-50DC-43BF-BE83-3742FED03C9C}
本地音乐.{3dfdf296-dbec-4fb4-81d1-6a3438bcf4de}
我的音乐.{1CF1260C-4DD0-4EBB-811F-33C572699FDE}
本地文档.{d3162b92-9365-467a-956b-92703aca08af}
我的文档.{A8CDFF1C-4878-43be-B5FD-F8091C1C60D0}
此设备.{f8278c54-a712-415b-b593-b77a2be0dda9}
应用.{4234d49b-0245-4df3-b780-3893943456e1}
下载.{374DE290-123F-4565-9164-39C4925E467B}
桌面.{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}
打印机.{2227A280-3AEA-1069-A2DE-08002B30309D}
本地下载.{088e3905-0323-4b02-9826-5d99428e115f}
OneDrive.{018D5C66-4533-4307-9B53-224DE2ED1FE6}
安装新程序.{15eae92e-f17a-4431-9f28-805e482dafd4}
卸载程序.{7b81be6a-ce2b-4676-a29e-eb907a5126c5}
网络连接.{992CFFA0-F557-101A-88EC-00DD010CCC48}
回收站.{645FF040-5081-101B-9F08-00AA002F954E}
历史.{ff393560-c2a7-11cf-bff4-444553540000}
管理工具.{d20ea4e1-3957-11d2-a40b-0c5020524153}
早年间,这种方法被当作用来隐藏私密文件的技巧。首先将要隐藏的私密文件存入一个新建文件夹,然后把新建文件夹重命名为上述格式。这样一来,其他用户就无法在资源管理器中访问到该文件夹下的文件了。但是这种隐藏文件的方法对没有使用 Windows Shell 接口的第三方文件管理器或者命令行无效。