Moznosti mate v podstate 2, co jsem ted objevil na internetu. Bud pres registry nebo pres WMI. Kratsi kod napisete pres wmi, ale pres registry vam to zase najde vice programu. Nacitani pres wmi je take pomalejsi. Jen pro srovnani, v mem pripade mi to v registrech naslo 189 programu, pres WMI 155 a dialog “pridat nebo odebrat programy” ukazuje zase pro zmenu ze mam nainstalovanych jen 87 programu, ale urcite je lepsi vice nez mene. Nechce se mi ted rucne porovnavat vsechny aplikace v “Pridat nebo odebrat programy” s mym vystupem z registru, ale na prvni pohled zadna aplikace nechybi, coz tak trochu doklada i tento obrazek:
A ted ke samotnemu kodu. Kod ktery jsem napsal uklada ihned po nacteni do vlastnosti ItemsSource control ListBox a zapisuje pocet ziskanych programu metodou WriteToTextBoxInstalledAppsCount, takze tyto 2 radky muzete klidne nahradit podle svych potreb. Kod pro nacteni pomoci WMI vypada takto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
List<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); } |
Kdezto kod pro nacteni z registru vypada takto(na 64bitovem systemu, na 32bit OS bude urcite potreba odstranit ty 2 odkazy ktere pouzivaji hodnotu Registry64 vyctu RegistryView):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
List<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 ja jdu konecne zjistovat jak naprogramovat tetris protoze muj predchozi pokus ho naprogramovat v Dartu, kdyz jsem o tom mel minimalni znalosti, nevysel prilis uspesne.