深入 Windows 传统右键菜单注册表模型ContextMenu Manager Plus 如何实现 shell 与 shellex 菜单的启用/禁用【免费下载链接】ContextMenuMgrContext Menu Manager Plus 是一个强大的实用程序它可帮助您管理 Windows 上的右键菜单并避免第三方向你的右键菜单里塞屎项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuMgr你是否曾右键一个文件却被十几个第三方软件塞进来的菜单项刷屏Context Menu Manager Plus 是一个 Windows 右键菜单管理工具它直接管理注册表中shell 与 shellex两类传统右键菜单项支持一键启用/禁用、第三方新增自动拦截审核、删除前备份与随时恢复让你自己决定右键菜单里留下什么。 先搞懂Windows 右键菜单藏在注册表里Windows 的右键菜单并不是存在某一个地方而是按对象类型分散在注册表的多个入口里。理解这一点是理解本工具工作原理的前提。右键菜单主要有两个载体载体注册表位置示例工作方式典型用途shell verbHKCR\*\shell\verb运行子键command里记录的命令行打开方式、编辑、用 XX 处理shellex handlerHKCR\*\shelext\ContextMenuHandlers\name默认值是一个 CLSID指向一个 COM 扩展 DLL第三方 Shell 扩展功能项目用枚举 ContextMenuEntryKind 把菜单项区分为ShellVerb和ShellExtension两种来源类型后续的扫描、开关、删除策略全部按类型分流。 注意HKCRHKEY_CLASSES_ROOT只是用户级 Classes 与机器级 Classes 的合并视图读着方便但写入时必须明确写到HKEY_USERS\SID\Software\Classes仅当前用户还是HKLM\SOFTWARE\Classes所有用户。 扫描范围ContextMenu Manager Plus 如何找到所有菜单项后端通过一张监控根清单 MonitoredRoots 定义扫描范围覆盖 10 大分类文件、所有文件系统对象、文件夹、目录背景、桌面背景、驱动器、库、此电脑、回收站等。每个分类都会扫描三个子路径见 ContextMenuSubRootRelativePathsshell—— 启用状态的 verb 菜单shelext\ContextMenuHandlers—— 启用状态的 handlershelext\-ContextMenuHandlers——禁用镜像位后面详解带连字符的停车场扫描得到的每一项都被建模为 ContextMenuEntry携带稳定 Id、注册表路径、命令文本、CLSID、启用状态、备份状态等字段再合并项目自己的状态库后返回给前端界面展示。完整的模型说明见官方文档 docs/registry-model.md。⚙️ 禁用 shell 菜单写一个可见性标记而不是删键对于shell类型的菜单项ContextMenu Manager Plus不会删除注册表键而是引入一个文档化的可见性控制值禁用在 verb 键上写入名为ProgrammaticAccessOnly的空字符串值见 ShellVerbVisibility.SetEnabled。Explorer 看到这个值就会隐藏菜单项但程序仍可通过显式指定 verb 调用该命令不影响系统行为。启用删除这个标记值菜单项恢复显示。启用状态的判断ShellVerbVisibility.GetState会同时检查三个来源ProgrammaticAccessOnly本工具写入、LegacyDisable、HideBasedOnVelocityId。后两者属于第三方或系统遗留标记只参与只读可见性判断不会被普通开关盲删。几个安全细节首次禁用前会保存该值原有的存在性与精确数据provenance重复禁用不覆盖启用时只恢复自己保存过的值不会顺手删掉第三方写的值。CommandFlags属于EXPCMDFLAGS与开关无关普通操作永不改写。️ 禁用 shellex 菜单把键搬到禁用镜像位shellexhandler 的禁用思路完全不同——移动键而不是改值状态物理位置启用root\shelext\ContextMenuHandlers\name禁用root\shelext\-ContextMenuHandlers\name两个位置共享同一个稳定 Id启用/禁用就是把键在这两个容器之间来回移动移动前后都会重新打开物理键校验 CLSID 一致。这种方式不触碰扩展 DLL 本身、无需注销重新启用也只是搬回去。当同一个 handler 在启用位和禁用位同时存在例如第三方软件又写了一份时后端会读取两侧键的最后写入时间以较新一侧为事实并自动清理较旧一侧若 HKLM 与用户级存在多个物理副本则所有副本一起移动并逐一验证详见 docs/registry-model.md 第 10.5 节。️ 事务与校验保证每次注册表修改可靠一次普通的开关操作在 ContextMenuRegistryCatalog 中走的是物理路径级事务写入前捕获本次会改变的值的类型、精确数据和注册表代际指纹执行写入关闭句柄后重新打开同一物理键做读回验证通过逻辑/物理一致性核对后才提交到状态库 ContextMenuStateStore任一步失败则乐观回滚仅当当前值仍等于本事务写入值时才恢复原值若第三方已改成别的内容则保留第三方结果并返回冲突码绝不覆盖。状态库保存的是上一次已确认状态 用户开关意图 待审核状态 删除恢复记录而不是注册表副本。 拦截与审核第三方新增的菜单先禁用再问你ContextMenu Manager Plus 的监控器ContextMenuRegistryMonitor基于周期性快照比较发现变化核心规则非常克制场景行为软件运行期间出现未知菜单项立即禁用并写入状态库进入待审核队列由用户决定去留已知项在相邻稳定快照中从关变开静默重新关闭你之前明确关掉的软件停止期间出现的新项重启后发现只标记为 Added 展示不自动禁用等待用户确认已知项开关在离线期间变化保留当前注册表状态标记 Modified 等用户确认也就是说运行时拦截新入侵离线时只汇报不擅动——这是拦截 → 审核 → 用户裁决设计的关键。️ 删除与恢复先备份再动手删除菜单项前RegistryBackupService 会先用reg.exe export导出.reg备份保存到DeletedBackups目录然后才删除真实注册表项并记录删除状态。恢复时通过备份导入还原让误删可回滚。Portable 版还会按机器指纹隔离备份防止把 A 电脑的备份恢复到 B 电脑上。 一句话总结菜单类型禁用手段恢复手段shell verb写入ProgrammaticAccessOnly可见性标记删除该标记shelext handler把键移到-ContextMenuHandlers禁用镜像位把键移回启用位两种手段都做到可逆、可验证、可回滚再配合事务校验、审核队列和.reg备份ContextMenu Manager Plus 把一个高风险的注册表操作变成了普通用户也能安心点击的开关。想深入源码细节推荐从 docs/registry-model.md 和 ContextMenuMgr.Backend/Services/ 目录读起。【免费下载链接】ContextMenuMgrContext Menu Manager Plus 是一个强大的实用程序它可帮助您管理 Windows 上的右键菜单并避免第三方向你的右键菜单里塞屎项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuMgr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考