Jak získat všechny nainstalované programy ve Windows

Možnosti máte v podstatě 2, co jsem teď objevil na internetu. Buď přes registry nebo přes WMI. Kratší kód napíšete přes wmi, ale přes registry vám to zase najde více programů. Načítání přes wmi je také pomalejší. Jen pro srovnání, v mém případě mi to v registrech našlo 189 programů, přes WMI 155 a dialog “přidat nebo odebrat programy” ukazuje zase pro změnu že mám nainstalovaných jen 87 programů, ale určitě je lepší více než méně. Nechce se mi teď ručně porovnávat všechny aplikace v “Přidat nebo odebrat programy” s mým výstupem z registru, ale na první pohled žádná aplikace nechybí, což tak trochu dokládá i tento obrázek:

A teď ke samotnému kódu. Kód který jsem napsal ukládá ihned po načtení do vlastnosti ItemsSource control ListBox a zapisuje počet získaných programů metodou WriteToTextBoxInstalledAppsCount, takže tyto 2 řádky můžete klidně nahradit podle svých potřeb. Kód pro načtení pomocí WMI vypadá takto:

CODEList<string> appsNames = new List<string>();

private void FillListBoxAppsByManagementObject()
{
    appsNames.Clear();
    ManagementObjectCollection moReturn;
    ManagementObjectSearcher moSearch;

    moSearch = new ManagementObjectSearcher(" Select* from Win32_Product");

    moReturn = moSearch.Get();
    ObservableCollection<installedapp> iapps = new ObservableCollection<installedapp>();
    foreach (ManagementObject mo in moReturn)
    {
        object mo2 = mo[" Name"];
        if (mo2 != null)
        {
            string appName = mo2.ToString().Trim();
            if (!appsNames.Contains(appName))
            {
                appsNames.Add(appName);
                iapps.Add(new InstalledApp { AppName = appName });
            }
        }
    }
    lbInstalledApps.ItemsSource = iapps;
    WriteToTextBoxInstalledAppsCount(iapps);
}

Kdežto kód pro načtení z registru vypadá takto(na 64bitovém systému, na 32bit OS bude určitě potřeba odstranit ty 2 odkazy které používají hodnotu Registry64 výčtu RegistryView):

CODEList<string> appsNames = new List<string>();

private void FillListBoxAppsByRegistry()
{
    appsNames.Clear();
    ObservableCollection<installedapp> ias = new ObservableCollection<installedapp>();

    RegistryView rv32 = RegistryView.Registry32;
    RegistryView rv64 = RegistryView.Registry64;

    GetInstalledAppsFromRegistry(ias, rv32, RegistryHive.CurrentUser);
    GetInstalledAppsFromRegistry(ias, rv64, RegistryHive.CurrentUser);
    GetInstalledAppsFromRegistry(ias, rv32, RegistryHive.LocalMachine);
    GetInstalledAppsFromRegistry(ias, rv64, RegistryHive.LocalMachine);

    lbInstalledApps.ItemsSource = ias;
    WriteToTextBoxInstalledAppsCount(ias);
}

private void GetInstalledAppsFromRegistry(ObservableCollection<installedapp> ias, RegistryView rv32, RegistryHive h)
{
    string displayName;
    RegistryKey key;
    key = RegistryKey.OpenBaseKey(h, rv32).OpenSubKey(@" SOFTWAREMicrosoftWindowsCurrentVersionUninstall");
    foreach (String keyName in key.GetSubKeyNames())
    {
        RegistryKey subkey = key.OpenSubKey(keyName);
        displayName = subkey.GetValue("DisplayName") as string;
        if (!appsNames.Contains(displayName))
        {
            appsNames.Add(displayName);
            if (displayName != null && displayName.Trim() != "")
            {
                ias.Add(new InstalledApp { AppName = displayName });
            }
        }
    }
}

Tak a já jdu konečně zjišťovat jak naprogramovat tetris protože můj předchozí pokus ho naprogramovat v Dartu, když jsem o tom měl minimální znalosti, nevyšel příliš úspěšně.

Leave a Reply

Your email address will not be published. Required fields are marked *