2016-05-02 7 views
0

まず、システム上にインストールされているすべてのプログラムをスキャンします。これから私はInstallLocationとDisplayNameを取得します。 この名前または場所からスキャンしたプログラムを実行します。 これを行う方法はありますか、または実行可能ファイルの名前や場所が本当に必要ですか?インストール場所からプログラムを実行

public static class InstalledPrograms 
{  
    const string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; 

    public static List<string> GetInstalledPrograms() 
    { 
     var result = new List<string>(); 
     var termsList = new List<string>(); 
     result.AddRange(GetInstalledProgramsFromRegistry(RegistryView.Registry32)); 
     result.AddRange(GetInstalledProgramsFromRegistry(RegistryView.Registry64)); 
     result = result.Distinct().ToList(); 
     result.Sort(); 
     foreach (var i in result) 
     { 
      Console.WriteLine(i); 

     } 
     return result; 
    } 

    private static IEnumerable<string> GetInstalledProgramsFromRegistry(RegistryView registryView) 
    { 
     var result = new List<string>(); 

     using (RegistryKey key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView).OpenSubKey(registry_key)) 
     { 
      foreach (string subkey_name in key.GetSubKeyNames()) 
      { 
       using (RegistryKey subkey = key.OpenSubKey(subkey_name)) 
       { 
        if (IsProgramVisible(subkey)) 
        { 
         var ii = (string)subkey.GetValue("InstallLocation"); 
         result.Add(ii); 
        } 
       } 
      } 
     } 

     return result; 
    } 

    private static bool IsProgramVisible(RegistryKey subkey) 
    { 
     var name = (string)subkey.GetValue("DisplayName"); 
     var releaseType = (string)subkey.GetValue("ReleaseType"); 
     //var unistallString = (string)subkey.GetValue("UninstallString"); 
     var systemComponent = subkey.GetValue("SystemComponent"); 
     var parentName = (string)subkey.GetValue("ParentDisplayName"); 

     return 
      !string.IsNullOrEmpty(name) 
      && string.IsNullOrEmpty(releaseType) 
      && string.IsNullOrEmpty(parentName) 
      && (systemComponent == null); 
    } 
} 
+0

プログラムの起動方法については、 'System.Diagnostics.Process'を参照してください。 –

答えて

1

短い答えは、レジストリツリーのその部分を使用してアプリケーションのパスを見つけることができませんなしです。その情報はインストールに依存します。 できますそのパスが提供されているので、アンインストーラを見つけます。私は真剣にあなたのプログラムのユーザーがあなたがインストールされているすべてのアプリケーション/ホットフィックスのアンインストールを呼び出すことに満足するだろうと疑う。

唯一できることは、これらのディレクトリを.exe個のファイルに対してスキャンすることです。あなたが1つしか持っていなければ、あなたはOKかもしれません。もちろん、インストーラをインストールした場合は、アンインストーラが同じディレクトリに存在する可能性があります。

インストールされているすべてのアプリケーションを単に起動するだけの方法はありません。インストールされたオブジェクトは、既存の製品のライブラリや拡張機能です。

もう1つ考慮すべきことは、ストアアプリにはインストール/アンインストールの方法や起動された方法などの新しいルールがあるということです。 Windowsストアアプリには、見つけられたとしても簡単に呼び出せる「.exe」ファイルはありません。

+0

私はインストールされたすべてのプログラムを実行したくありません。私はプログラムのリストを作成して、ユーザーがこのリストからプログラムを実行できるようにしたい。もっとショートカットに似ています。 ディレクトリで.exeファイルをスキャンできます。しかし、同じディレクトリにあるこれらのアンインストーラは確かに問題です。私の問題を解決する方法や、この問題を解決するための他の方法を教えてください。 –

+0

もう1つの問題は、右アプリとストアアプリです。複数のEXEがある場合、EXEが正しいかどうかを判断する方法はありません(また、ユーティリティコードを持つソフトウェアを別々のEXEに出荷します)。 –

関連する問題