检查项
简述
最新桌面版ChatGPT等微软商店打包应用的右键菜单不写在注册表里,目前注册表的方法对于这些软件并不适用
详细内容
下面这堆的叫AI帮写的,我自己其实也不是很懂,不过方法确实是有用的_(:3」 ∠)__
背景 / 问题现象
很多现代桌面应用(例如 OpenAI 的 ChatGPT 桌面端 OpenAI.Codex、各类通过 Microsoft Store 或 MSIX 侧载分发的软件)会在文件夹 / 文件上注入右键菜单项。
以 ChatGPT 桌面端为例,在文件夹上右键会出现 "Open project in ChatGPT" 这一项。但在本工具的列表里完全看不到它,用注册表编辑器手动搜索 ChatGPT / OpenAI 也搜不到任何字符串,因此既无法禁用也无法删除。
现有实现的局限
本工具目前是通过扫描注册表(如 HKEY_CLASSES_ROOT\Directory\shell\*、shellex\ContextMenuHandlers 等)来枚举右键菜单项的。
但 AppX / MSIX 打包应用的右键菜单不写在注册表里:菜单文字存放在应用自身的资源文件中,系统是在运行时读取 AppxManifest.xml 的声明动态生成的。因此纯注册表扫描必然漏掉这一类,导致用户(像我)绕了一大圈才找到解决办法。
技术分析(已实测确认)
打包应用在其 AppxManifest.xml 中声明如下扩展(这是直接从已安装包的清单里读到的真实结构):
<desktop4:FileExplorerContextMenus>
<desktop5:ItemType Type="Directory">
<desktop5:Verb Id="OpenProjectInCodex" Clsid="d28d30e7-17f3-41d9-93f0-9bae6dc4884b" />
</desktop5:ItemType>
</desktop4:FileExplorerContextMenus>
要点:
- 菜单文字(
Open project in ChatGPT)在应用资源里,注册表无对应字符串 → 注册表扫描失效。
- 扩展通过
Verb 的 Clsid({d28d30e7-17f3-41d9-93f0-9bae6dc4884b})唯一标识,走的是 Windows 外壳扩展加载机制。
- 已知可用的禁用方式:把该 CLSID 加入系统级外壳扩展黑名单
Shell Extensions\Blocked,Explorer 在加载时会按"值名"比对,命中即跳过。
获取 CLSID 的参考命令(PowerShell):
# 列出所有声明了 FileExplorerContextMenus 的已安装包及其 CLSID
Get-AppxPackage | ForEach-Object {
$pkg = $_
try {
$m = Get-AppxPackageManifest -Package $pkg.PackageFullName
$m.Package.Applications.Application.Extensions.Extension |
Where-Object { $_.OuterXml -like '*FileExplorerContextMenus*' } |
ForEach-Object {
[xml]$x = $_.OuterXml
$x.SelectNodes('//*[@Clsid]') | ForEach-Object {
[PSCustomObject]@{
Package = $pkg.Name
DisplayName = $pkg.PublisherDisplayName
ItemType = $_.LocalName
Clsid = $_.Clsid
}
}
}
} catch {}
}
禁用(加入黑名单)的参考命令:
:: 机器级(需管理员),重启 Windows 资源管理器后生效
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked" /v "{d28d30e7-17f3-41d9-93f0-9bae6dc4884b}" /t REG_SZ /d "" /f
:: 或用户级(无需管理员,仅对当前用户生效)
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked" /v "{d28d30e7-17f3-41d9-93f0-9bae6dc4884b}" /t REG_SZ /d "" /f
注意:Blocked 是按值名(即 CLSID 本身)匹配,而不是按值数据,这一点很关键。
建议新增的功能
希望本工具在现有"注册表菜单"之外,新增一类 "打包应用右键菜单(Store / AppX / MSIX)" 的管理入口:
- 枚举:扫描已安装的 AppX 包,解析清单中声明
FileExplorerContextMenus(以及可能的 FileTypeAssociation 相关菜单)的扩展,列出对应的包名 / 应用名 / 作用对象(Directory、文件类型等)。
- 展示:菜单的可见文字尽量从应用资源中解析;解析不到时至少显示包名 + CLSID,让用户能识别是哪个软件。
- 禁用 / 启用:对每一项提供开关,底层实现为在
Shell Extensions\Blocked 中增删该 CLSID(HKCU 或 HKLM,按是否管理员可选),操作后提示用户重启资源管理器。
- (可选)对普通注册表类菜单保持现有逻辑不变,两类分开显示,避免混淆。
为什么这个功能有价值
- 这类打包应用正越来越多,它们注入的右键菜单目前没有任何现成 GUI 工具能管理,用户只能手动改注册表黑名单或卸载应用。
- 黑名单方式不卸载应用、可逆、且通常能跨应用更新持续生效,是最优解;工具把它做成开关,能大幅降低普通用户的使用门槛。
验证案例
- 应用:
OpenAI.Codex(ChatGPT 桌面端,AppX 包)
- 现象:文件夹右键出现 "Open project in ChatGPT",注册表与现有工具均无法发现。
- 解决:将
{d28d30e7-17f3-41d9-93f0-9bae6dc4884b} 加入 Shell Extensions\Blocked 并重启资源管理器后,菜单消失;从黑名单移除后恢复。已实测有效。
检查项
简述
最新桌面版ChatGPT等微软商店打包应用的右键菜单不写在注册表里,目前注册表的方法对于这些软件并不适用
详细内容
下面这堆的叫AI帮写的,我自己其实也不是很懂,不过方法确实是有用的_(:3」 ∠)__
背景 / 问题现象
很多现代桌面应用(例如 OpenAI 的 ChatGPT 桌面端
OpenAI.Codex、各类通过 Microsoft Store 或 MSIX 侧载分发的软件)会在文件夹 / 文件上注入右键菜单项。以 ChatGPT 桌面端为例,在文件夹上右键会出现 "Open project in ChatGPT" 这一项。但在本工具的列表里完全看不到它,用注册表编辑器手动搜索
ChatGPT/OpenAI也搜不到任何字符串,因此既无法禁用也无法删除。现有实现的局限
本工具目前是通过扫描注册表(如
HKEY_CLASSES_ROOT\Directory\shell\*、shellex\ContextMenuHandlers等)来枚举右键菜单项的。但 AppX / MSIX 打包应用的右键菜单不写在注册表里:菜单文字存放在应用自身的资源文件中,系统是在运行时读取
AppxManifest.xml的声明动态生成的。因此纯注册表扫描必然漏掉这一类,导致用户(像我)绕了一大圈才找到解决办法。技术分析(已实测确认)
打包应用在其
AppxManifest.xml中声明如下扩展(这是直接从已安装包的清单里读到的真实结构):要点:
Open project in ChatGPT)在应用资源里,注册表无对应字符串 → 注册表扫描失效。Verb的Clsid({d28d30e7-17f3-41d9-93f0-9bae6dc4884b})唯一标识,走的是 Windows 外壳扩展加载机制。Shell Extensions\Blocked,Explorer 在加载时会按"值名"比对,命中即跳过。获取 CLSID 的参考命令(PowerShell):
禁用(加入黑名单)的参考命令:
建议新增的功能
希望本工具在现有"注册表菜单"之外,新增一类 "打包应用右键菜单(Store / AppX / MSIX)" 的管理入口:
FileExplorerContextMenus(以及可能的FileTypeAssociation相关菜单)的扩展,列出对应的包名 / 应用名 / 作用对象(Directory、文件类型等)。Shell Extensions\Blocked中增删该 CLSID(HKCU 或 HKLM,按是否管理员可选),操作后提示用户重启资源管理器。为什么这个功能有价值
验证案例
OpenAI.Codex(ChatGPT 桌面端,AppX 包){d28d30e7-17f3-41d9-93f0-9bae6dc4884b}加入Shell Extensions\Blocked并重启资源管理器后,菜单消失;从黑名单移除后恢复。已实测有效。