2010-12-16 132 views
2

我的要求是读取与Adobe Acrobat Reader相关的特定注册表键值,并根据该键值作出决定。Adob​​e Acrobat Reader注册表键值位置不断变化

虽然这看起来很简单,就像我需要使用注册表类(用于.NET) 查询密钥,然后根据该值做出决定。

但是,我现在面临的问题是,注册表键位在几乎每个新版本的Adobe Acrobat Reader中都会不断变化。

我现在所能想到的是在我的代码中有一个开关盒来处理所有不同的Adobe版本。

RegistryKey adobe = Registry.LocalMachine.OpenSubKey("Software").OpenSubKey("Adobe"); 
      if (adobe != null) 
      { 
       RegistryKey acroRead = adobe.OpenSubKey("Acrobat Reader"); 
       if (acroRead != null) 
       { 
        string[] acroReadVersions = acroRead.GetSubKeyNames(); 
        Console.WriteLine("The following version(s) of Acrobat Reader are installed: "); 
        foreach (string versionNumber in acroReadVersions) 
        { 
         switch(versionNumber) 
         { 
          case 1.x = //do something; 
             //break;  
          case 2.x = //do something; 
             //break; 
          case 6.x = //do something; 
             //break; 
          case 9.x = //do something; 
             //break; 
         } 
        } 
       } 
      } 

但有些我不满意这种方法。每次Adobe发布新版本时,我都必须确保我必须以不同方式处理它。任何建议更好的方法。

感谢

回答

2

你最希望的是打开包含版本号的注册表项,然后列举每个子键,可能验证它看起来像一个版本号,再看看每个这些子项的东西,你想。您可能只想使用您找到的最高版本号。

显然这只会在你想要的东西总是包含在与版本关键字相同的注册表项中,或者总是包含在同一个命名条目中(然后你必须枚举子键下的每个元素来寻找你想要的东西)。

如果你想要的东西在每个版本中都改变名称和位置,那么你将会遇到问题,除非你能以某种方式从数据中识别它,在这种情况下枚举每个元素并查看4个数据,是你想要的,但这种方法可能充满危险或误报。

0

嗯,我有相同的问题,因为我知道Adobe是不是在他们的决策和气质如此辉煌,我想我会尝试这个办法:

public static string AcrobatReaderPath 
    { 
     get 
     { 
      var paths = new List<string>() 
        { 
         Registry.GetValue(@"HKEY_CLASSES_ROOT\Software\Adobe\Acrobat\Exe", "", @"C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe") as string 
        }; 
      var files = Directory.GetFileSystemEntries(@"C:\Program Files (x86)\Adobe\", @"*Acr*R*d*32.exe", SearchOption.AllDirectories); 
      paths.AddRange(files); 
      foreach(var path in paths) if (File.Exists(path)) return path; 
      return ""; 
     } 
    } 

我的注册表已经没有亲戚关系的Acrobat在:

HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\

..所以看起来Adobe正在将他们的注册表项遍布注册表随着时间的推移... 我只希望他们会避免移动的Acrobat本身Program Files文件夹之外在T他的未来......(你永远不知道这些人......)

0

我想你可以应用以下逻辑: 土坯文件关联被保存在注册表中 - 您可以在 HKEY_CLASSES_ROOT阅读\ .PDF \ OpenWithList

这些子项的应用程序名称(如果有的话):

  • Acrobat.exe
  • AcroRD32.exe
  • 等。

使用它们结合起来,并读取键(或打开应该存在)

  • HKEY_CLASSES_ROOT \应用程序\ XXXX \壳\打开\命令
  • HKEY_CLASSES_ROOT \应用程序\ XXXX \ shell \ Read \ command

如果存在,它们将类似于 “C:\ Prog ram文件(x86)\ Adob​​e \ Acrobat 7.0 \ Acrobat \ Acrobat.exe“”%1“ 从哪里可以去除%1并获取Adobe应用程序路径。

这里是C#代码:

private void AddShellCommandDefault(List<string> lst, RegistryKey shell, string reg KeyOpenRead) 
{ 
    var shellOpen = shell.OpenSubKey(regKeyOpenRead); 
    if (shellOpen == null) return; 

    var shellOpenCommand = shellOpen.OpenSubKey("command"); 
    if (shellOpenCommand == null) return; 

    var defaultVal = shellOpenCommand.GetValue(null); 
    if (defaultVal == null) return; 

    int kex = defaultVal.ToString().LastIndexOf(".exe", StringComparison.OrdinalIgnoreCase); 
    if (kex < 0) return; 

    lst.Add(defaultVal.ToString().Substring(0, kex).Replace("\"", "") + ".exe"); 
} 

public List<string> GetAdobeApps() 
{ 
    var addobeList = new List<string>(); 

    // HKEY_CLASSES_ROOT\.pdf\OpenWithList\Acrobat.exe 
    // HKEY_CLASSES_ROOT\Applications\Acrobat.exe\shell\Open\command 
    // default "C:\Program Files (x86)\Adobe\Acrobat 7.0\Acrobat\Acrobat.exe" "%1" 

    var adobe = Registry.ClassesRoot.OpenSubKey(".pdf"); 
    if (adobe == null) return addobeList; 

    var openWith = adobe.OpenSubKey("OpenWithList"); 
    if (openWith == null) return addobeList; 

    var apps = Registry.ClassesRoot.OpenSubKey("Applications"); 
    if (apps == null) return addobeList; 

    foreach (string sLong in openWith.GetSubKeyNames()) 
    { 
     string s = sLong.Split(@"\/".ToCharArray()).Last(); 
     var adobeApp = apps.OpenSubKey(s); 
     if (adobeApp == null) continue; 

     var shell = adobeApp.OpenSubKey("shell"); 
     if (shell == null) continue; 

     AddShellCommandDefault(addobeList, shell, "Read"); 
     AddShellCommandDefault(addobeList, shell, "Open"); 
    } 

    return addobeList; 
}   

When run GetAdobeApps, it returns collection similar to Count = 2 [0]: "C:\\Program Files (x86)\\Adobe\\Acrobat 7.0\\Acrobat\\Acrobat.exe" [1]: "C:\\Program Files (x86)\\Adobe\\Reader 9.0\\Reader\\AcroRd32.exe"