private void ListRefreshThread(LoadingDialog.LoadingDialogInterface dialogInterface) { dialogInterface.SetMaximum(1); dialogInterface.SetProgress(0); var detectedUninstallers = new List <ApplicationUninstallerEntry>(ApplicationUninstallerManager.GetUninstallerList(x => { if (x.CurrentCount == 1) { dialogInterface.SetMaximum(x.TotalCount * 2); } dialogInterface.SetProgress(x.CurrentCount); })); detectedUninstallers.AddRange( ApplicationUninstallerManager.GetApplicationsFromDrive(detectedUninstallers, x => { dialogInterface.SetProgress(x.TotalCount + x.CurrentCount); if (x.CurrentCount == 1) { dialogInterface.SetMaximum(x.TotalCount * 2); } })); if (Program.IsInstalled) { detectedUninstallers.RemoveAll(entry => entry.RegistryKeyName.IsNotEmpty() && entry.RegistryKeyName.Equals(Program.InstalledRegistryKeyName, StringComparison.InvariantCultureIgnoreCase)); } if (_settings.Settings.QuietAutomatization && Program.Net4IsAvailable) { QuietUninstallTools.GenerateQuietCommands(detectedUninstallers, _settings.Settings.QuietAutomatizationKillStuck); } try { detectedUninstallers.AddRange(ApplicationUninstallerManager.GetWindowsFeaturesList()); } catch (Exception ex) { PremadeDialogs.GenericError(ex); } AllUninstallers = detectedUninstallers; dialogInterface.SetProgress(1); dialogInterface.SetMaximum(1); try { _iconGetter.UpdateIconList(detectedUninstallers); } catch (Exception ex) { PremadeDialogs.GenericError(ex); } try { ReassignStartupEntries(false); } catch (Exception ex) { PremadeDialogs.GenericError(ex); } }
public void RunUninstall(IEnumerable <ApplicationUninstallerEntry> selectedUninstallers, IEnumerable <ApplicationUninstallerEntry> allUninstallers, bool quiet) { if (!TryGetUninstallLock()) { return; } var listRefreshNeeded = false; try { var targets = new List <ApplicationUninstallerEntry>(selectedUninstallers); if (!_settings.AdvancedDisableProtection) { var protectedTargets = targets.Where(x => x.IsProtected).ToList(); if ( MessageBoxes.ProtectedItemsWarningQuestion(protectedTargets.Select(x => x.DisplayName).ToArray()) == MessageBoxes.PressedButton.Cancel) { return; } targets.RemoveAll(protectedTargets); } if (targets.Any()) { _lockApplication(true); // Steam will be required to run loud steam app uninstalls if (!CheckForRunningProcessesBeforeUninstall(targets, !quiet)) { return; } if (!SystemRestore.BeginSysRestore(targets.Count)) { return; } // No turning back at this point (kind of) listRefreshNeeded = true; if (_settings.ExternalEnable && _settings.ExternalPreCommands.IsNotEmpty()) { LoadingDialog.ShowDialog(Localisable.LoadingDialogTitlePreUninstallCommands, controller => { RunExternalCommands(_settings.ExternalPreCommands, controller); }); } var status = ApplicationUninstallerManager.RunBulkUninstall(targets, GetConfiguration(quiet)); status.OneLoudLimit = _settings.UninstallConcurrentOneLoud; status.ConcurrentUninstallerCount = _settings.UninstallConcurrency ? _settings.UninstallConcurrentMaxCount : 1; status.Start(); using (var uninstallWindow = new UninstallProgressWindow()) { uninstallWindow.Shown += (sender, args) => ((UninstallProgressWindow)sender).SetTargetStatus(status); uninstallWindow.ShowDialog(MessageBoxes.DefaultOwner); } var junkRemoveTargetsQuery = from bulkUninstallEntry in status.AllUninstallersList where bulkUninstallEntry.CurrentStatus == UninstallStatus.Completed || bulkUninstallEntry.CurrentStatus == UninstallStatus.Invalid || (bulkUninstallEntry.CurrentStatus == UninstallStatus.Skipped && !bulkUninstallEntry.UninstallerEntry.RegKeyStillExists()) select bulkUninstallEntry.UninstallerEntry; SearchForAndRemoveJunk(junkRemoveTargetsQuery, allUninstallers); if (_settings.ExternalEnable && _settings.ExternalPostCommands.IsNotEmpty()) { LoadingDialog.ShowDialog(Localisable.LoadingDialogTitlePostUninstallCommands, controller => { RunExternalCommands(_settings.ExternalPostCommands, controller); }); } SystemRestore.EndSysRestore(); } else { MessageBoxes.NoUninstallersSelectedInfo(); } } finally { ReleaseUninstallLock(); _lockApplication(false); if (listRefreshNeeded) { _initiateListRefresh(); } } }