【发布时间】:2011-02-10 12:46:26
【问题描述】:
我已经编写了一个编辑特定文件类型的程序,我希望用户可以选择在启动时将我的应用程序设置为该文件类型的默认编辑器(因为我不需要安装程序)。
我试图通过向 HKEY_CLASSES_ROOT 添加一个密钥来编写一个可重用的方法来为我关联一个文件(最好在任何操作系统上,尽管我正在运行 Vista),并且我正在将它与我的应用程序一起使用,但是它好像没用。
public static void SetAssociation(string Extension, string KeyName, string OpenWith, string FileDescription)
{
RegistryKey BaseKey;
RegistryKey OpenMethod;
RegistryKey Shell;
RegistryKey CurrentUser;
BaseKey = Registry.ClassesRoot.CreateSubKey(Extension);
BaseKey.SetValue("", KeyName);
OpenMethod = Registry.ClassesRoot.CreateSubKey(KeyName);
OpenMethod.SetValue("", FileDescription);
OpenMethod.CreateSubKey("DefaultIcon").SetValue("", "\"" + OpenWith + "\",0");
Shell = OpenMethod.CreateSubKey("Shell");
Shell.CreateSubKey("edit").CreateSubKey("command").SetValue("", "\"" + OpenWith + "\"" + " \"%1\"");
Shell.CreateSubKey("open").CreateSubKey("command").SetValue("", "\"" + OpenWith + "\"" + " \"%1\"");
BaseKey.Close();
OpenMethod.Close();
Shell.Close();
CurrentUser = Registry.CurrentUser.CreateSubKey(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\" + Extension);
CurrentUser = CurrentUser.OpenSubKey("UserChoice", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl);
CurrentUser.SetValue("Progid", KeyName, RegistryValueKind.String);
CurrentUser.Close();
}
知道为什么它不起作用吗?一个示例使用可能是
SetAssociation(".ucs", "UCS_Editor_File", Application.ExecutablePath, "UCS File");
如果我使用 regedit 执行相同操作,则使用“CurrentUser”的方法部分似乎可以工作,但使用我的应用程序却不行。
【问题讨论】:
-
你试过以管理员身份运行你的程序吗?
-
UAC 意味着您的应用不会以管理员身份运行,除非您明确要求它。你运行 Vista,Vista 包括 UAC。您能否再次检查程序是否以管理员身份运行?
-
我试过“以管理员身份运行”加上 UAC 已经关闭,但程序运行后文件仍然没有关联。
-
我认为您的方法中倒数第三行可能不正确。我认为您不想将“CurrentUser”设置为子项。
标签: c# registry file-association