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

How to get programmatically access to add a new entry in Context Menu?

我会在上下文菜单中添加一个新条目 "Share",因此右键单击一个文件我会在上下文菜单中看到这个新条目 "Share"。我尝试了下面的代码,但是方法 CreateSubKey() 抛出异常 System.UnauthorizedAccessException 说 Denied Access to key 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);

我在这个 guide 上看到了一些东西,但我认为在 .NET2.0 上它有所不同

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

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

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

要在您的应用程序中强制使用管理员权限,请将 app.manifest / 清单文件添加到您的 visual studio 项目并取消注释此行 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

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

<?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>

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