我正在尝试删除一个恰好是SAPI 5用户配置文件的注册表项子树,如下所示。 “ nameofprofile”是子项的数据值,子项名称是CLSID,但是它带有一个异常,告诉我该子项不存在?
RegistryKey RegKey = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Speech\\RecoProfiles\\Tokens\\", true);
RegKey.DeleteSubKeyTree("NameOfProfile");
答案 0 :(得分:1)
您可以尝试一下。
string keyName = @"Software\Microsoft\Speech\RecoProfiles\Tokens";
using (RegistryKey key = Registry.CurrentUser.OpenSubKey(keyName, true))
{
key.DeleteSubKeyTree("NameOfProfile",false);
}
如果再次出现错误,则可以尝试以管理员模式运行应用程序。
答案 1 :(得分:0)
首先搜索string[] GetSubKeyNames()
,然后查看子键是否存在。
如果遇到问题,请尝试忽略大小写。
var name = @"Software\Microsoft\Speech\RecoProfiles\Tokens";
var regKey = Registry.CurrentUser.OpenSubKey(name, true);
if (regKey != null) {
using (regKey) {
var subKeyName = "CLSID";
var actual = regKey.GetSubKeyNames()
.FirstOrDefault(n => string.Equals(n, subKeyName, StringComparison.InvariantCultureIgnoreCase));
if (actual != null) {
regKey.DeleteSubKeyTree(actual);
}
}
}
答案 2 :(得分:0)
最后,我自己解决了这个问题,并且效果很好。我应该在帖子中说我一直都知道配置文件名称,但我不知道CLSID。毫无疑问,有一种更简便的方法(不需要特殊权限,如果可能的话,最好是这样):
public static void DeleteKey (String profileName)
{
// Folder for SAPI 5 user profile tokens
String keyLocation = @"Software\Microsoft\Speech\RecoProfiles\Tokens";
RegistryKey key = Registry.CurrentUser.OpenSubKey(keyLocation, true);
// Get a list of Key names and work out which one is the "test" profile
String [] subKeyNames = key.GetSubKeyNames();
// Enumerate through the sub key names to find out which one is the "Test" profile
for(int i = 0; i < subKeyNames.Length; i++)
{
RegistryKey subKey =
Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Speech\\RecoProfiles\\Tokens\\" + subKeyNames[i]);
if(((String)subKey.GetValue("")).Equals(profileName))
{
key.DeleteSubKeyTree(subKeyNames[i]);
return;
}
}
}