You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用C#将自定义功能添加到Windows右键上下文菜单

C#实现将解压工具添加到Windows右键上下文菜单的具体方案

以下分两种实现方式,可根据你的功能需求选择:

方案1:静态注册表注入(复杂度低,适合固定菜单项需求)

该方式直接修改Windows注册表添加固定菜单项,无需COM组件开发,适合仅需要固定展示解压入口的场景。
注意:操作注册表需要程序以管理员权限运行,否则会抛出权限不足异常

实现步骤

  • 先确定你需要添加菜单的触发场景,对应不同注册表路径:
    • 选中.zip/.rar等压缩文件时展示:HKEY_CLASSES_ROOT\SystemFileAssociations\.[后缀名]\shell
    • 文件夹空白处右键展示:HKEY_CLASSES_ROOT\Directory\Background\shell
    • 选中文件夹右键展示:HKEY_CLASSES_ROOT\Directory\shell
  • 引入Microsoft.Win32命名空间操作注册表,示例代码如下:
using Microsoft.Win32;
using System;

public class RightMenuRegister
{
    // 替换为你的解压程序实际安装路径,打包分发时建议动态获取安装路径
    private const string UnzipAppPath = @"C:\Program Files\MyUnzipTool\MyUnzipTool.exe";

    /// <summary>
    /// 为指定压缩格式添加右键菜单项
    /// </summary>
    /// <param name="extension">压缩格式后缀,不带点,如zip、rar、7z</param>
    public static void AddMenuForExtension(string extension)
    {
        string registryPath = $@"SystemFileAssociations\.{extension}\shell";
        using (var shellKey = Registry.ClassesRoot.OpenSubKey(registryPath, true) ?? 
                              Registry.ClassesRoot.CreateSubKey(registryPath))
        {
            // 创建自定义菜单项节点
            using (var menuKey = shellKey.CreateSubKey("用我的解压工具解压"))
            {
                // 菜单项展示图标,取exe自身的第0个图标
                menuKey.SetValue("Icon", $"{UnzipAppPath},0");
                // 创建command节点,定义点击菜单时执行的命令
                using (var cmdKey = menuKey.CreateSubKey("command"))
                {
                    // %1 是系统传递的选中文件的完整路径,可自定义加参数如 -x 代表直接解压到当前目录
                    cmdKey.SetValue("", $"\"{UnzipAppPath}\" \"%1\"");
                }
            }
        }
    }

    /// <summary>
    /// 删除指定压缩格式对应的右键菜单项
    /// </summary>
    public static void RemoveMenuForExtension(string extension)
    {
        string registryPath = $@"SystemFileAssociations\.{extension}\shell";
        using (var shellKey = Registry.ClassesRoot.OpenSubKey(registryPath, true))
        {
            shellKey?.DeleteSubKeyTree("用我的解压工具解压", throwOnMissingSubKey: false);
        }
    }
}

额外配置

  • 给程序添加管理员权限声明:在项目中添加app.manifest文件,将requestedExecutionLevel节点的level属性改为requireAdministrator,确保程序运行时能获得修改注册表的权限
  • 在你的程序入口Main函数中接收参数,处理传入的文件路径,执行对应的解压逻辑即可
  • 需要支持多格式的话,循环调用AddMenuForExtension传入zip、rar、7z等后缀即可

方案2:Shell扩展开发(复杂度高,适合动态菜单需求)

如果需要实现动态菜单逻辑(比如选中多个压缩文件时显示批量解压选项、根据文件大小展示不同操作),需要开发Windows Shell扩展:
注意:.NET Core/.NET 5+ 不支持进程内COM组件开发,该方案仅适用于.NET Framework 4.x版本

  • 实现IShellExtInit和IContextMenu两个核心Shell扩展接口,处理选中的文件列表,自定义生成菜单项
  • 将实现的COM组件注册到系统,关联到对应压缩格式的Shell扩展节点
  • 调试和分发时需要重启资源管理器才能生效,安装包需要处理COM组件的注册/注销逻辑

常见问题排查

  • 64位系统下32位程序操作注册表会自动重定向到Wow6432Node,需要指定RegistryView.Registry64访问64位注册表避免菜单不显示
  • 菜单添加后不生效可先重启资源管理器测试,再检查注册表项是否正确写入
  • 程序卸载时必须调用删除方法清理写入的注册表项,避免留下系统垃圾

内容的提问来源于stack exchange,提问作者user17075388

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 08:15:03