C# 如何以编程方式访问上下文菜单以添加新条目?

C# 如何以编程方式访问上下文菜单以添加新条目?,c#,visual-studio,c#-4.0,.net-4.0,registry,C#,Visual Studio,C# 4.0,.net 4.0,Registry,我会在上下文菜单中添加一个新条目“Share”,所以右键单击一个文件,我会在上下文菜单中看到这个新条目“Share”。我在下面的代码中进行了尝试,但方法CreateSubKey()抛出异常System.UnauthorizedAccessException,表示拒绝访问密钥HKEY_CLASSES_ROOT const string MenuName = "*\\shell\\NewMenuOption"; const string Command = "*\\shell\\NewMenuOpt

我会在上下文菜单中添加一个新条目“Share”,所以右键单击一个文件,我会在上下文菜单中看到这个新条目“Share”。我在下面的代码中进行了尝试,但方法CreateSubKey()抛出异常System.UnauthorizedAccessException,表示拒绝访问密钥HKEY_CLASSES_ROOT

const string MenuName = "*\\shell\\NewMenuOption";
const string Command = "*\\shell\\NewMenuOption\\command";
RegistryKey key = null;
key = Registry.ClassesRoot.CreateSubKey(MenuName, RegistryKeyPermissionCheck.ReadWriteSubTree); 
key = Registry.ClassesRoot.CreateSubKey(Command, RegistryKeyPermissionCheck.ReadWriteSubTree);
key.SetValue("Share", ObjectToStore);

我在上面看到了一些东西,但我认为在.NET2.0上是不同的

如果您要添加到HK_CLASSES_ROOT,您的应用程序将必须以提升的权限运行。理想情况下,您应该保留对HK_用户的任何更改,这些更改应具有相同的子密钥

我认为您需要(本地?)管理员权限才能执行此操作。尝试以管理员身份执行应用程序。
如果可行,您有两个选择:

方法一是要求管理员拥有运行应用程序的权限,这不是最好的办法。
方法二是第二个(命令行)项目,它只有一个目的,即创建这些注册表项。此应用程序需要管理员权限。您可以从主应用程序运行此应用程序(
进程。启动(…)

要强制应用程序中的管理员权限,请将
app.manifest
/manifest文件添加到visual studio项目中,并取消对此行的注释

孔文件应如下所示(visual studio为您生成的app.manifest中有更多默认条目)



然后转到项目设置、应用程序,并在下方屏幕的清单下选择app.manifest文件。重建。完成。

如果可能,应避免创建需要提升权限的应用程序。在这种情况下,添加到HK_用户可能更合适。@FedericoRizzo更多详细信息会更好。。。您尝试了什么,发生了什么?这当然是更好的解决方案(在您的情况下),但有时需要管理员权限。那么这是一条路要走。我已经测试了我的文章(再次),对我来说很有用。现在我知道上下文菜单可以用HK_用户编辑,所以我必须找到另一个解决方案。我必须使用HK_类_根。如果我什么都找不到,我会尝试更好的解决方案。我只需要理解为每次启动应用程序时都要避免许可请求请稍等。你确定我可以使用HK_用户编辑关联菜单吗@这篇文章有一个更详细的指导方法;我解决了这个问题,运行一个具有管理员权限的单独exe来设置密钥。这样,权利的要求只被要求一次@Michael
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
        <!-- <requestedExecutionLevel  level="highestAvailable" uiAccess="false" /> -->
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>