☰
ContextMenuManager:一款基于注册表的 Windows 右键菜单管理工具全解析
2026/10/1 17:25:55 网站建设 项目流程
  • 桌面应用
  • 系统工具

【免费下载链接】ContextMenuManager

🖱️ 纯粹的Windows右键菜单管理程序

项目地址:https://gitcode.com/gh_mirrors/co/ContextMenuManager
点击查看免费下载

ContextMenuManager 是一个开源的 Windows 右键菜单管理程序,核心目标是在不破坏注册表的前提下,以系统原生机制安全地启用、禁用、修改、定位和自定义右键菜单项。本文以官方英文说明(README-en.md)为主线,结合仓库源码(MainForm.cs、ShellItem.cs、AppConfig.cs 等)深入剖析其工作原理、配置项、更新机制与使用注意事项,帮助你安全高效地管理 Windows 右键菜单。

一、项目定位:一个"纯粹"的右键菜单管理程序

ContextMenuManager 由开发者 BluePointLilac 独立开发,官方定位是"A program to manage the Windows right-click context menu"(一个管理 Windows 右键菜单的程序)。它区别于一般"清理工具"的关键在于:它尽可能使用系统提供的注册表键值来隐藏菜单项,而不是简单粗暴地备份后删除注册表项(见 README-en.md 的 Notices 一节)。

这一点在源码中得到印证。以文件/文件夹场景的核心实现类 ShellItem.cs 为例,其可见性判定并非依赖删除菜单项注册表键,而是读取一系列系统保留键值:

  • LegacyDisable:存在即视为禁用;
  • ProgrammaticAccessOnly:存在即视为仅允许程序化访问(对用户隐藏);
  • HideBasedOnVelocityId:值为0x639bc8时隐藏,且该键值仅在 Windows 10 1703 及以上版本生效(源码中有明确注释//HideBasedOnVelocityId键值仅适用于Win10系统1703以上版本);
  • CommandFlags:对非 Vista 系统,当其值% 16 >= 8时视为隐藏。

这种"隐藏而非删除"的策略意味着菜单项原始数据仍然保留在注册表中,用户可以随时通过本程序恢复,这正是官方文档强调"不要同时使用多个右键菜单管理程序"的原因——不同管理工具可能采用完全不同的(往往是破坏性的)禁用手段,混用会导致菜单项在彼此的视图中"消失"。

二、下载与运行环境要求

官方发布说明明确了如下下载与运行前提(见 README-en.md 的 Download 一节):

  • 在发行版的 Assets 列表中选择zip 压缩包(推荐)或 exe 单文件;
  • 程序分为.NET 3.5 版和.NET 4.0 版两个构建,均适用于 Windows Vista / 7 / 8 / 8.1 / 10;
  • Win7 自带 .NET 3.5;Win8 / 8.1 / 10 自带 .NET 4.0 及以上;Vista 两者都不自带,需要手动安装对应的 .NET Framework 运行库;
  • 若系统自带对应 .NET 版本则可直接运行,否则需先安装运行时。

仓库工程文件 ContextMenuManager.csproj 中<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>确认了当前源码面向 .NET 4.0 编译(与 README 的"分 .NET 3.5 / 4.0 两个版本发布"的描述一致,源码注释//兼容.Net3.5和.Net4.0,兼容Vista - Win11也表明项目刻意保持了向后兼容性)。程序入口 Program.cs 依次完成:启用 VisualStyles、检测单实例、加载界面字符串、定期检查更新、重载字典,最后启动 MainForm。

三、核心功能逐项解析

README 将主要功能归纳为五类,下面结合源码逐一展开:

3.1 启用 / 禁用各类右键菜单项

官方说明覆盖的场景包括:文件(File)、文件夹(Folder)、子菜单(Submenu,如打开方式、发送到)、IE 浏览器、Win+X 菜单。从 MainForm.cs 的主界面控件清单可以看出,程序为每一类场景都准备了独立的列表组件:

场景对应控件注册表/存储位置(由源码可见)
文件、文件夹、目录、桌面、驱动器等 Shell 菜单ShellListHKEY_CLASSES_ROOT\*\shell等 Shell 键
新建菜单ShellNewListHKEY_CLASSES_ROOT\.ext\ShellNew及资源目录Properties/Resources/ShellNew
发送到菜单SendToListshell:sendto对应目录中的快捷方式
打开方式菜单OpenWithListHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts
Win+X 菜单WinXList%LocalAppData%\Microsoft\Windows\WinX
IE 浏览器菜单IEListIE 相关注册表项
增强菜单 / 详细编辑 / GUID 拦截EnhanceMenusList、DetailedEditList、GuidBlockedList由Texts目录下的字典文件驱动

主界面左侧边栏的导航项(MainForm.cs 中的GeneralItems数组)依次覆盖 File、Folder、Directory、Background、Desktop、Drive、AllObjects、Computer、RecycleBin、Library、New、SendTo、OpenWith、WinX 等对象类型,对应"文件、文件夹、子菜单、IE、WinX"的官方描述。

3.2 修改菜单名称与图标

对任意菜单项,程序支持直接修改其显示名称(对应注册表 Shell 键的默认值)与图标(对应Icon键值)。在 ShellItem.cs 中可以看到,图标显示通过GuidInfo.GetFilePath(Guid)解析 GUID 对应的文件路径,或从命令字符串(ItemCommand)中提取可执行文件路径后提取图标资源;菜单项还实现了ITsiTextItem、ITsiIconItem等接口(见 Controls/Interfaces 目录),分别负责文本编辑与图标编辑的用户交互。

3.3 永久删除菜单项

与"隐藏"不同,删除操作会真正移除菜单项。源码中RegistryEx.DeleteKeyTree(见 RegistryEx.cs)实现了递归删除注册表项树,并可通过throwOnMissingKey参数控制"找不到键或无权操作时是否抛出异常";与之配套的CopyTo/MoveTo扩展方法则支持将整个注册表子树复制或移动到另一位置(MoveTo内部先CopyTo再DeleteKeyTree)。这为"备份-移动"式操作提供了底层能力,也呼应了官方 Notices 中"程序能帮助你找到菜单项对应的注册表和文件位置"的说法。

3.4 在注册表或文件资源管理器中定位菜单项

每个菜单项都支持一键跳转:既可以在regedit中定位到其注册表路径,也可以在资源管理器中打开其对应的文件位置。相关开关见 AppConfig.cs 中的OpenMoreRegedit与OpenMoreExplorer两个配置项(是否展开更多定位选项)。RegistryEx提供了一系列路径解析工具方法,例如:

  • GetParentPath(regPath):获取注册表项的上一级路径;
  • GetKeyName(regPath):获取注册表项的项名;
  • GetRootName(regPath):获取根项名(HKEY_CLASSES_ROOT等);
  • GetRootAndSubRegPath:将完整路径解析为根RegistryKey与子路径两部分。

这些方法支持HKCR/HKCU/HKLM/HKU/HKCC五种根项,是"导航注册表位置"功能的地基。

3.5 自定义添加菜单项与命令

除管理已有菜单项外,程序还支持向上述场景自定义添加项目与自定义菜单命令(对应 NewShellDialog.cs、NewItemForm.cs、NewLnkFileDialog.cs、NewOpenWithDialog.cs 等新建对话框,以及Resources/Images中的NewItem.png、NewFolder.png、Add.png等按钮图标)。Win+X 菜单的新增项还需要通过 WinXHasher.cs 计算特殊的哈希值写入快捷方式属性:

  • 通过SHCreateItemFromParsingName打开.lnk文件对应的IShellItem2;
  • 读取System.Link.TargetParsingPath与System.Link.Arguments两个属性;
  • 将"目标路径 + 参数 + 固定字符串do not prehash links..."拼接后统一转小写,再调用shlwapi.dll的HashData计算哈希;
  • 将结果写入System.Winx.Hash(PKEY 为FB8D2D7B-90D1-4E34-BF60-6EAC09922BBF,propID 2)。

其中目标路径中的%ProgramFiles%、%SystemRoot%\System32、%SystemRoot%会被替换为固定 GUID 后再参与哈希,确保哈希值与 Windows 自身计算方式一致(源码注释注明参考了 hashlnk 项目)。这一细节充分体现了"程序尽可能使用系统原生机制"的设计哲学。

四、界面与程序架构概览

主窗体 MainForm.cs 采用"工具栏 + 侧边栏 + 主体列表"的三区布局:

  • 顶部工具栏提供五个标签页:主页(Home)、类型(Type)、规则(Rule)、刷新(Refresh)、关于(About);
  • 主体区域由MainControls数组统一管理,除上述场景列表外还包括设置面板AppSettingBox、语言面板LanguagesBox、字典面板DictionariesBox、关于与捐赠面板;
  • 列表项通过Controls/Interfaces目录下的一组接口(如IChkVisibleItem启用/禁用、ITsiRegPathItem注册表定位、ITsiFilePathItem文件定位、ITsiRegExportItem注册表导出、ITsiWebSearchItem网络搜索、ITsiDeleteItem删除等)组合出每个菜单项可执行的操作集合,属于典型的"接口组合"设计。

程序启动后通过Updater.PeriodicUpdate()与XmlDicHelper.ReloadDics()完成更新检查与字典装载(见 Program.cs)。值得一提的是 ExplorerRestarter.cs —— 菜单修改往往需要重启资源管理器才能生效,该组件在需要时自动完成 explorer 重启。

五、配置文件与可调参数(Config.ini)

程序配置统一存放在Config\Config.ini中(AppConfig.cs)。配置文件位置遵循如下规则:

  • 优先使用程序目录下的Config文件夹(Application.StartupPath\Config);
  • 若不存在(便携模式/权限受限),则回退到%AppData%\ContextMenuManager\Config;
  • 首次运行时还会自动创建Backup(备份)、Languages(语言)、Programs、Dictionaries\Web与Dictionaries\User(字典)等目录,退出时若目录为空会自动删除。

配置文件分为[General]与[Window]两个节,核心参数如下(键名与默认值均来自 AppConfig.cs 源码):

节键取值/默认说明
GeneralLanguage如zh-CN、en-US;default表示跟随系统;空值取当前区域界面语言,对应languages目录下的.ini语言文件
GeneralAutoBackup1/0,默认1修改前自动备份菜单项注册表数据到Backup目录
GeneralUpdateFrequency7/30/90/-1,默认30自动检查更新间隔天数;-1表示从不自动检查
GeneralProtectOpenItem1/0,默认1保护"打开"菜单项,防止误删系统关键项
GeneralEngineUrl搜索引擎 URL,%s为关键词占位菜单项右键"网络搜索"使用的搜索引擎,内置 Bing、Baidu、Google、Yandex、DuckDuckGo、Sogou、360 七种(见EngineUrlsDic)
GeneralShowFilePath1/0,默认0是否在列表中显示菜单项对应的文件路径
GeneralWinXSortable1/0,默认0是否允许对 Win+X 菜单项排序(仅 Win8 及以上显示该选项)
GeneralOpenMoreRegedit/OpenMoreExplorer1/0定位注册表 / 文件时是否展开更多可定位位置
GeneralHideDisabledItems1/0是否在列表中隐藏已被禁用的菜单项
GeneralHideSysStoreItems1/0,默认1是否隐藏系统商店类(Store)菜单项(仅 Win7 及以上显示该选项)
GeneralRequestUseGithub1/0;中文系统默认0更新检查优先使用 GitHub 还是 Gitee 接口
WindowTopMost1/0主窗体是否置顶
WindowMainFormSize宽,高,如800,600主窗体尺寸,退出时保存

设置界面 AppSettingBox.cs 与上述配置一一对应:支持在"AppData 目录 / 程序目录"之间切换配置存放位置(切换时会复制现有配置并重启程序)、设置更新频率、选择更新仓库(Github/Gitee)等。

六、更新机制与多语言支持

程序内更新是官方推荐的更新方式。README 说明:"程序与字典更新都可以在程序内完成安装,覆盖原文件",并指出"受 GitHub 与 Gitee Raw 的限制,程序每月只能检查一次更新"。

源码 Updater.cs 中的实现细节与之吻合:

  • 启动时PeriodicUpdate()读取UpdateFrequency(-1则跳过),根据LastCheckUpdateTime(以二进制DateTime.ToBinary()存储)判断是否到期,到期则异步执行更新检查;
  • 通过UAWebClient请求 GitHub / Gitee 的 latest release API(URL 依据RequestUseGithub切换,见 AppConfig.cs 顶部常量),解析tag_name与本地Application.ProductVersion比较版本;
  • 发现新版本时,根据当前进程的 .NET 版本(Environment.Version > 4.0判 4.0 否则 3.5)在 assets 中匹配对应构建,经下载对话框下载后重启完成更新;
  • 除程序本体外,还会同步更新languages与Texts目录下的语言文件和字典文件(GuidInfosDic.ini、DetailedEditDic.xml、EnhanceMenusDic.xml、UwpModeItemsDic.xml)。

多语言支持方面,README 声明"欢迎为此程序制作语言字典",仓库 languages 目录实际包含 ar-DZ、de-DE、en-US、ja-JP、ko-KR、pt-BR、ru-RU、zh-CN、zh-TW 共 9 种语言的.ini字典;工程文件的 PostBuildEvent(见 ContextMenuManager.csproj)会把Languages目录与内置AppLanguageDic.ini一并拷贝到输出目录的Config\Languages下。

七、兼容性与系统支持范围

官方说明明确的支持范围如下(见 README-en.md):

  • 系统版本:Windows Vista、7、8、8.1、10(源码注释中亦提及兼容至 Win11 的意图,但官方文档以 Vista–10 为准);
  • 架构:32 位与 64 位操作系统均可运行;
  • 高分屏:支持显示缩放,最佳显示缩放比为 150% DPI(对应 HighDpi.cs 与 ControlExtension.cs 中的DpiZoom()自适应实现);
  • 本地化:程序支持国际化多语言显示。

此外,从 ShellItem.cs 可见程序对系统版本差异做了精细化处理:HideBasedOnVelocityId仅在 Win10 1703+ 判断;CommandFlags键值在 Vista 上不适用;LegacyDisable/ProgrammaticAccessOnly不适用于子菜单项。这些边界处理保证了同一份代码在不同版本 Windows 上的行为正确。

八、使用注意事项(官方 Notices 逐条解读)

  1. 特殊菜单项可能"看似启用":部分特殊菜单项(Shell 扩展、文件加密(&Y)等)受其他因素影响不会直接显示在右键菜单中,但按程序通用的判定规则仍会显示为"启用",这属于正常现象。
  2. 避免混用多个右键菜单管理程序:不同程序禁用菜单的方法不同,多数程序采用"简单暴力的备份删除法",而本程序尽可能使用系统提供的键值进行隐藏。如果你曾用过其他管理程序禁用了某些菜单项,请先用原程序还原,否则可能无法在本程序中看到对应项。
  3. 程序不负责"卸载清理":它不做彻底的卸载残留清理,但可以快速定位菜单项对应的注册表位置与文件位置,供你自行处理;如果你不熟悉注册表操作,官方建议只使用启用/禁用功能,避免误删。

前两条注意事项在源码中均有对应体现:ShellItem的可见性读取的是系统保留键值(隐藏式),而其他程序若直接删除注册表项,本程序自然无法再枚举到该菜单项;ProtectOpenItem配置与TryProtectOpenItem()方法则专门保护open等关键菜单项不被误操作。

九、安全使用建议与总结

ContextMenuManager 的价值在于将"右键菜单管理"这一高度依赖注册表的操作,封装为一套可回退、可定位、可自定义的图形界面工具。综合官方文档与源码,使用与评估该工具时建议关注以下几点:

  • 优先使用"启用/禁用"而非"删除":隐藏式操作可逆性强,删除则需自行备份(程序默认开启AutoBackup,备份存于Config\Backup);
  • 注意 .NET 运行时匹配:根据系统自带版本选择 .NET 3.5 或 4.0 构建,Vista 用户需先安装运行库;
  • 了解你的配置文件:Config.ini中的UpdateFrequency、RequestUseGithub、HideSysStoreItems等参数直接影响更新行为与列表显示,可在设置面板或直接编辑文件调整;
  • 对系统版本差异保持预期:个别键值(如HideBasedOnVelocityId)只对特定版本生效,菜单项的显示结果可能因系统而异。

对于需要深入研究的读者,仓库提供了完整的 C# 源码可供研读:界面骨架见 MainForm.cs,菜单项可见性逻辑见 ShellItem.cs,注册表底层操作见 RegistryEx.cs,配置体系见 AppConfig.cs,Win+X 哈希算法见 WinXHasher.cs,更新流程见 Updater.cs。项目作者鼓励用户反馈 Bug 与优化建议,并提供了 Donate.md 捐赠名单与二维码用于支持项目发展。

  • 桌面应用
  • 系统工具

【免费下载链接】ContextMenuManager

🖱️ 纯粹的Windows右键菜单管理程序

项目地址:https://gitcode.com/gh_mirrors/co/ContextMenuManager
点击查看免费下载
上一篇:OpenMower终极指南:3步将传统割草机升级为智能GPS机器人
下一篇:Static项目推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询