C# 如何在 Windows 文件系统中添加自定义右键菜单

时间:2022-08-30 20:22:48

Healthy (2011) http://blog.sina.com.cn/s/blog_752ca76a0100y5yv.html (Available at 2013/11/16)


意图:在 Windows 文件系统中添加自定义的右键菜单项。
方法:通过改写注册表实现
  一、给所有类型的文件添加自定义的右键菜单
  HKEY_CLASSES_ROOT\*\shell  
        HKEY_CLASSES_ROOT\*\shell\自定义的菜单名
        HKEY_CLASSES_ROOT\*\shell\自定义的菜单名\command
          值名称:(默认)     类型:REG_SZ      数据:关联程序的完全限定名称
  二、给所有文件夹添加自定义的右键菜单
    HKEY_CLASSES_ROOT\Directory\shell
        HKEY_CLASSES_ROOT\Directory\shell\自定义的菜单名  
        HKEY_CLASSES_ROOT\Directory\shell\自定义的菜单名\command
          值名称:(默认)     类型:REG_SZ      数据:关联程序的完全限定名称


实现:C# WinForm 

using Microsoft.Win32;
private void AddFileContextMenuItem(string itemName, string associatedProgramFullPath)
{
    //创建项:shell 
    RegistryKey shellKey = Registry.ClassesRoot.OpenSubKey(@"*\shell",true);
    if (shellKey == null)
    {
        shellKey = Registry.ClassesRoot.CreateSubKey(@"*\shell");  
    }


    //创建项:右键显示的菜单名称
    RegistryKey rightCommondKey = shellKey.CreateSubKey(itemName);
    RegistryKey associatedProgramKey= rightCommondKey.CreateSubKey("command");


    //创建默认值:关联的程序
    associatedProgramKey.SetValue(string.Empty, associatedProgramFullPath);


    //刷新到磁盘并释放资源
    associatedProgramKey.Close();
    rightCommondKey.Close();
    shellKey.Close(); 
}


private void AddDirectoryContextMenuItem(string itemName, string associatedProgramFullPath)
{
    //创建项:shell 
    RegistryKey shellKey = Registry.ClassesRoot.OpenSubKey(@"directory\shell", true);
    if (shellKey == null)
    {
        shellKey = Registry.ClassesRoot.CreateSubKey(@"*\shell");  
    }


    //创建项:右键显示的菜单名称
    RegistryKey rightCommondKey = shellKey.CreateSubKey(itemName);
    RegistryKey associatedProgramKey = rightCommondKey.CreateSubKey("command");


    //创建默认值:关联的程序
    associatedProgramKey.SetValue("", associatedProgramFullPath);




    //刷新到磁盘并释放资源
    associatedProgramKey.Close();
    rightCommondKey.Close();
    shellKey.Close(); 
}


Reference: http://msdn.microsoft.com/en-us/library/cc144148(VS.85).aspx

【正文结束】