Skip to content

[Feat]: 支持管理 微软商店 / AppX 打包应用的右键菜单(比如ChatGPT) #184

Description

@Maozai-Teng

检查项

  • 此功能未被提出过(可以在这里进行搜索)
  • ContextMenuManager 的最新版本并未添加此功能
  • 我已知晓:如果只是某些想法,而不是具体的新功能,需要在 Discussions 中提交

简述

最新桌面版ChatGPT等微软商店打包应用的右键菜单不写在注册表里,目前注册表的方法对于这些软件并不适用

详细内容

下面这堆的叫AI帮写的,我自己其实也不是很懂,不过方法确实是有用的_(:3」 ∠)__

背景 / 问题现象

很多现代桌面应用(例如 OpenAI 的 ChatGPT 桌面端 OpenAI.Codex、各类通过 Microsoft Store 或 MSIX 侧载分发的软件)会在文件夹 / 文件上注入右键菜单项。

以 ChatGPT 桌面端为例,在文件夹上右键会出现 "Open project in ChatGPT" 这一项。但在本工具的列表里完全看不到它,用注册表编辑器手动搜索 ChatGPT / OpenAI 也搜不到任何字符串,因此既无法禁用也无法删除。

Image

现有实现的局限

本工具目前是通过扫描注册表(如 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>

要点:

  1. 菜单文字(Open project in ChatGPT)在应用资源里,注册表无对应字符串 → 注册表扫描失效。
  2. 扩展通过 VerbClsid{d28d30e7-17f3-41d9-93f0-9bae6dc4884b})唯一标识,走的是 Windows 外壳扩展加载机制。
  3. 已知可用的禁用方式:把该 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)" 的管理入口:

  1. 枚举:扫描已安装的 AppX 包,解析清单中声明 FileExplorerContextMenus(以及可能的 FileTypeAssociation 相关菜单)的扩展,列出对应的包名 / 应用名 / 作用对象(Directory、文件类型等)。
  2. 展示:菜单的可见文字尽量从应用资源中解析;解析不到时至少显示包名 + CLSID,让用户能识别是哪个软件。
  3. 禁用 / 启用:对每一项提供开关,底层实现为在 Shell Extensions\Blocked 中增删该 CLSID(HKCU 或 HKLM,按是否管理员可选),操作后提示用户重启资源管理器。
  4. (可选)对普通注册表类菜单保持现有逻辑不变,两类分开显示,避免混淆。

为什么这个功能有价值

  • 这类打包应用正越来越多,它们注入的右键菜单目前没有任何现成 GUI 工具能管理,用户只能手动改注册表黑名单或卸载应用。
  • 黑名单方式不卸载应用、可逆、且通常能跨应用更新持续生效,是最优解;工具把它做成开关,能大幅降低普通用户的使用门槛。

验证案例

  • 应用:OpenAI.Codex(ChatGPT 桌面端,AppX 包)
  • 现象:文件夹右键出现 "Open project in ChatGPT",注册表与现有工具均无法发现。
  • 解决:将 {d28d30e7-17f3-41d9-93f0-9bae6dc4884b} 加入 Shell Extensions\Blocked 并重启资源管理器后,菜单消失;从黑名单移除后恢复。已实测有效。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requesthelp wantedExtra attention is needed

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions