From e523013dddcd363e41dddf5b71b50d5a1d5e5c12 Mon Sep 17 00:00:00 2001 From: Belim Date: Tue, 6 May 2025 17:09:07 +0200 Subject: [PATCH] major backend updates done, UI updates pending --- src/MSCFixer/App.config | 14 ++ src/MSCFixer/AppIcon.ico | Bin 0 -> 13230 bytes src/MSCFixer/AppIcon.png | Bin 0 -> 17916 bytes src/MSCFixer/AppIcon32.png | Bin 0 -> 914 bytes src/MSCFixer/FeatureBase.cs | 4 +- src/MSCFixer/FeatureLoader.cs | 5 +- src/MSCFixer/FeatureManager.cs | 31 +++-- src/MSCFixer/FeatureNode.cs | 4 + src/MSCFixer/Features/AI/CopilotTaskbar.cs | 4 +- src/MSCFixer/Features/AI/Recall.cs | 10 +- src/MSCFixer/Features/Ads/FileExlorerAds.cs | 4 +- src/MSCFixer/Features/Ads/FinishSetupAds.cs | 4 +- src/MSCFixer/Features/Ads/LockScreenAds.cs | 4 +- src/MSCFixer/Features/Ads/PersonalizedAds.cs | 4 +- src/MSCFixer/Features/Ads/SettingsAds.cs | 4 +- src/MSCFixer/Features/Ads/StartmenuAds.cs | 4 +- .../Features/Ads/TailoredExperiences.cs | 4 +- .../Features/Ads/TipsAndSuggestions.cs | 4 +- .../Features/Ads/WelcomeExperienceAds.cs | 4 +- src/MSCFixer/Features/Edge/BrowserSignin.cs | 4 +- src/MSCFixer/Features/Edge/DefaultTopSites.cs | 10 +- .../Features/Edge/DefautBrowserSetting.cs | 4 +- src/MSCFixer/Features/Edge/EdgeCollections.cs | 4 +- .../Features/Edge/EdgeShoppingAssistant.cs | 4 +- .../Features/Edge/FirstRunExperience.cs | 4 +- src/MSCFixer/Features/Edge/GamerMode.cs | 4 +- src/MSCFixer/Features/Edge/HubsSidebar.cs | 4 +- .../Features/Edge/ImportOnEachLaunch.cs | 4 +- src/MSCFixer/Features/Edge/StartupBoost.cs | 4 +- .../Features/Edge/TabPageQuickLinks.cs | 4 +- src/MSCFixer/Features/Edge/UserFeedback.cs | 4 +- src/MSCFixer/Features/Gaming/GameDVR.cs | 6 +- .../Features/Gaming/PowerThrotteling.cs | 4 +- src/MSCFixer/Features/Gaming/VisualFX.cs | 4 +- src/MSCFixer/Features/Issues/BasicCleanup.cs | 6 +- src/MSCFixer/Features/Issues/WingetUpgrade.cs | 125 ++++++++++++++++++ .../Features/Privacy/ActivityHistory.cs | 4 +- .../Features/Privacy/LocationTracking.cs | 4 +- .../Features/Privacy/PrivacyExperience.cs | 6 +- src/MSCFixer/Features/Privacy/Telemetry.cs | 6 +- src/MSCFixer/Features/System/BSODDetails.cs | 4 +- src/MSCFixer/Features/System/MenuShowDelay.cs | 4 +- .../Features/System/NetworkThrottling.cs | 4 +- .../Features/System/SpeedUpShutdown.cs | 4 +- .../Features/System/SystemResponsiveness.cs | 4 +- src/MSCFixer/Features/System/VerboseStatus.cs | 4 +- src/MSCFixer/Features/UI/DarkMode.cs | 8 +- src/MSCFixer/Features/UI/FullContextMenus.cs | 6 +- src/MSCFixer/Features/UI/LockScreen.cs | 8 +- .../Features/UI/SearchBoxSuggestions.cs | 4 +- .../Features/UI/SearchboxTaskbarMode.cs | 4 +- .../Features/UI/ShowOrHideMostUsedApps.cs | 12 +- .../Features/UI/ShowTaskViewButton.cs | 4 +- src/MSCFixer/Features/UI/SnapAssistFlyout.cs | 4 +- src/MSCFixer/Features/UI/StartLayout.cs | 4 +- src/MSCFixer/Features/UI/TaskbarAlignment.cs | 4 +- src/MSCFixer/Features/UI/Transparency.cs | 4 +- src/MSCFixer/Helpers/HelperTool.cs | 23 ---- src/MSCFixer/Program.cs | 27 ++++ src/MSCFixer/Properties/AssemblyInfo.cs | 4 +- src/MSCFixer/app.manifest | 79 +++++++++++ 61 files changed, 392 insertions(+), 154 deletions(-) create mode 100644 src/MSCFixer/App.config create mode 100644 src/MSCFixer/AppIcon.ico create mode 100644 src/MSCFixer/AppIcon.png create mode 100644 src/MSCFixer/AppIcon32.png create mode 100644 src/MSCFixer/Features/Issues/WingetUpgrade.cs delete mode 100644 src/MSCFixer/Helpers/HelperTool.cs create mode 100644 src/MSCFixer/Program.cs create mode 100644 src/MSCFixer/app.manifest diff --git a/src/MSCFixer/App.config b/src/MSCFixer/App.config new file mode 100644 index 0000000..91126fc --- /dev/null +++ b/src/MSCFixer/App.config @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/MSCFixer/AppIcon.ico b/src/MSCFixer/AppIcon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e1cc304c71b794d41a7552a2367329014e176ba8 GIT binary patch literal 13230 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 Pz`)??>gTe~DWM4f8yOx( literal 0 HcmV?d00001 diff --git a/src/MSCFixer/AppIcon32.png b/src/MSCFixer/AppIcon32.png new file mode 100644 index 0000000000000000000000000000000000000000..d472978e1047a95d2483d87fe37069ee59d7b439 GIT binary patch literal 914 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>VD|BJ zaSVxYKRP|vL&Q<$SbE<1uX^!jIsq<|?&)b6vk0Y#>}Vv|Bs7+2LofrTwjElMidlXh)6WBq>J>>1JJWyfw>-Z=5u?(N&pfBt`- zot}1IVZ)Ez+rCGbtmekyNvhwzB7RE}K`xh2T8PAPuN@uSxW?+rwJaYJzhwck6okPCt zcRW5GURhYnP}uuyK`GmVql$70`!6#jlrDKzF2&$Dn^9riMTU&Ij4$**mohi-UHIO% zr;qi><#;n!)s`!J`dB78+<2$V*^#~F+?I2;R_uJ2n;9nD&STgh6;ynimq8$%p(ERb zA?i6poa{%#-wMmmdfIF@Frn8n(f2A z-YK5#j0&qRPM>zovcdfLA0MVjUA{*PO<5Xttvl+-P;)MGQp1Wgwg-V>-HQX-A2PI^ zS}xgOz%hN@-WPkixbKDi;L1I5OBlfNh^8-gO1%VC*4~{j3rpNgoK3@1KL6qU4 zR8{clO?wI|W#pp5OAIf!mQ6bF{L}>>rw^r7Yo|2VE}mL9o%crj$BjF$ zzi@lKjN!+V>sqw}iw(Xuu{ma^J)fYnbXn+O!_9I#;?@hswMG0Wdv$)!UP;|`6K80j z|6+Zv+R8?qLGyX;or**JCp(S*OCDk?*S`9}YVY=zY6o-Qd9Lvc44Ip|*ZlLhVQ&@w a%UyD9g76swu^S8w3=E#GelF{r5}E*xIGdIL literal 0 HcmV?d00001 diff --git a/src/MSCFixer/FeatureBase.cs b/src/MSCFixer/FeatureBase.cs index 55788dd..4c77c70 100644 --- a/src/MSCFixer/FeatureBase.cs +++ b/src/MSCFixer/FeatureBase.cs @@ -7,8 +7,8 @@ namespace Crapfixer public abstract string ID(); public abstract string Info(); public abstract string GetFeatureDetails(); - public abstract bool CheckFeature(); - public abstract Task DoFeature(); // async + public abstract Task CheckFeature(); // async + public abstract Task DoFeature(); // async public abstract bool UndoFeature(); } diff --git a/src/MSCFixer/FeatureLoader.cs b/src/MSCFixer/FeatureLoader.cs index 034067a..b34076c 100644 --- a/src/MSCFixer/FeatureLoader.cs +++ b/src/MSCFixer/FeatureLoader.cs @@ -22,6 +22,7 @@ namespace Features Children = { new FeatureNode(new BasicCleanup()), + new FeatureNode(new WingetUpgradeAll()) { DefaultChecked = false }, } }, @@ -70,8 +71,8 @@ namespace Features new FeatureNode(new StartLayout()), new FeatureNode(new TaskbarAlignment()), new FeatureNode(new Transparency()), - new FeatureNode(new AppDarkMode()), - new FeatureNode(new SystemDarkMode()), + new FeatureNode(new AppDarkMode()) { DefaultChecked = false }, + new FeatureNode(new SystemDarkMode()) { DefaultChecked = false }, new FeatureNode(new DisableSnapAssistFlyout()), } }, diff --git a/src/MSCFixer/FeatureManager.cs b/src/MSCFixer/FeatureManager.cs index fe8b6e0..52c605e 100644 --- a/src/MSCFixer/FeatureManager.cs +++ b/src/MSCFixer/FeatureManager.cs @@ -56,7 +56,7 @@ namespace Crapfixer TreeNode node = new TreeNode(text) { Tag = featureNode, - Checked = true, + Checked = featureNode.DefaultChecked, }; treeNodes.Add(node); @@ -67,12 +67,16 @@ namespace Crapfixer /// /// Analyzes all checked features recursively and logs only issues. /// - public static void AnalyzeAll(TreeNodeCollection nodes) + public static async Task AnalyzeAll(TreeNodeCollection nodes) { ResetAnalysis(); + // Iterate through all nodes and analyze each one recursively foreach (TreeNode node in nodes) - AnalyzeCheckedRecursive(node); + { + // Recursively analyze each node and ensure async tasks are awaited + await AnalyzeCheckedRecursive(node); + } Logger.Log("🔎 ANALYSIS COMPLETE", LogLevel.Info); Logger.Log(new string('=', 50), LogLevel.Info); @@ -82,46 +86,51 @@ namespace Crapfixer issuesFound > 0 ? LogLevel.Warning : LogLevel.Info); } + /// /// Recursively checks all features and logs misconfigurations. /// - private static void AnalyzeCheckedRecursive(TreeNode node) + private static async Task AnalyzeCheckedRecursive(TreeNode node) { if (node.Tag is FeatureNode fn) { + // If the node is not a category, is checked, and has a feature to check if (!fn.IsCategory && node.Checked && fn.Feature != null) { totalChecked++; - bool isOk = fn.Feature.CheckFeature(); + bool isOk = await fn.Feature.CheckFeature(); // Await the async operation if (!isOk) { issuesFound++; - node.ForeColor = Color.Red; // misconfigured + node.ForeColor = Color.Red; // Mark as misconfigured string category = node.Parent?.Text ?? "General"; Logger.Log($"❌ [{category}] {fn.Name} - Not configured as recommended."); Logger.Log($" ➤ {fn.Feature.GetFeatureDetails()}"); - // log a separator when an issue was found + // Log a separator when an issue was found Logger.Log(new string('-', 50), LogLevel.Info); } else { - node.ForeColor = Color.Gray; // properly configured + node.ForeColor = Color.Gray; // Mark as properly configured } } + // Recursively process child nodes and ensure awaiting the tasks foreach (TreeNode child in node.Nodes) - AnalyzeCheckedRecursive(child); + { + await AnalyzeCheckedRecursive(child); // Recursively call and await the result + } } } /// /// Analyzes a selected feature and logs its status. /// - public static void AnalyzeFeature(TreeNode node) + public static async void AnalyzeFeature(TreeNode node) { if (node.Tag is FeatureNode fn && !fn.IsCategory && node.Checked && fn.Feature != null) { - bool isOk = fn.Feature.CheckFeature(); + bool isOk = await fn.Feature.CheckFeature(); node.ForeColor = isOk ? Color.Gray : Color.Red; Logger.Log(isOk diff --git a/src/MSCFixer/FeatureNode.cs b/src/MSCFixer/FeatureNode.cs index 891d7fa..b63534f 100644 --- a/src/MSCFixer/FeatureNode.cs +++ b/src/MSCFixer/FeatureNode.cs @@ -8,6 +8,10 @@ public class FeatureNode public FeatureBase Feature { get; } public List Children { get; set; } = new List(); + + // Property to control default checked state + public bool DefaultChecked { get; set; } = true; + // Constructor for categories public FeatureNode(string name) { diff --git a/src/MSCFixer/Features/AI/CopilotTaskbar.cs b/src/MSCFixer/Features/AI/CopilotTaskbar.cs index e5879c5..b16a3f2 100644 --- a/src/MSCFixer/Features/AI/CopilotTaskbar.cs +++ b/src/MSCFixer/Features/AI/CopilotTaskbar.cs @@ -26,9 +26,9 @@ namespace Settings.AI return "This feature will disable Copilot in Taskbar."; } - public override bool CheckFeature() + public override Task CheckFeature() { - return Utils.IntEquals(keyName, valueName, 1); + return Task.FromResult(Utils.IntEquals(keyName, valueName, 1)); } public override Task DoFeature() diff --git a/src/MSCFixer/Features/AI/Recall.cs b/src/MSCFixer/Features/AI/Recall.cs index e0e5c95..b2281f5 100644 --- a/src/MSCFixer/Features/AI/Recall.cs +++ b/src/MSCFixer/Features/AI/Recall.cs @@ -27,25 +27,25 @@ namespace Settings.AI return "This will remove Recall from Windows 11 24H2"; } - public override bool CheckFeature() + public override Task CheckFeature() { // Check if reg key exists object value = Registry.GetValue(keyName, valueName, null); if (value == null) { // Key does not exist, turn off feature - return false; + return Task.FromResult(false); } // Key exists, check if value is desired value - return (int)value != recommendedValue; + return Task.FromResult((int)value == recommendedValue); } public override Task DoFeature() { try { - Registry.SetValue(keyName, valueName, 1, Microsoft.Win32.RegistryValueKind.DWord); + Registry.SetValue(keyName, valueName, recommendedValue, Microsoft.Win32.RegistryValueKind.DWord); Logger.Log("You've even disabled system-wide Snapshots for all users now.", LogLevel.Info); return Task.FromResult(true); } @@ -61,7 +61,7 @@ namespace Settings.AI { try { - Registry.SetValue(keyName, valueName, recommendedValue, Microsoft.Win32.RegistryValueKind.DWord); + Registry.SetValue(keyName, valueName, 1, Microsoft.Win32.RegistryValueKind.DWord); return true; } catch (Exception ex) diff --git a/src/MSCFixer/Features/Ads/FileExlorerAds.cs b/src/MSCFixer/Features/Ads/FileExlorerAds.cs index b1797d8..26cb01f 100644 --- a/src/MSCFixer/Features/Ads/FileExlorerAds.cs +++ b/src/MSCFixer/Features/Ads/FileExlorerAds.cs @@ -26,9 +26,9 @@ namespace Settings.Ads return "This feature will disable ads in File Explorer."; } - public override bool CheckFeature() + public override Task CheckFeature() { - return Utils.IntEquals(keyName, valueName, recommendedValue); + return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() diff --git a/src/MSCFixer/Features/Ads/FinishSetupAds.cs b/src/MSCFixer/Features/Ads/FinishSetupAds.cs index c3c6a4f..615c8f1 100644 --- a/src/MSCFixer/Features/Ads/FinishSetupAds.cs +++ b/src/MSCFixer/Features/Ads/FinishSetupAds.cs @@ -20,10 +20,10 @@ namespace Settings.Ads return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } - public override bool CheckFeature() + public override Task CheckFeature() { return - Utils.IntEquals(keyName, valueName, 0); + Task.FromResult(Utils.IntEquals(keyName, valueName, 0)); } public override Task DoFeature() diff --git a/src/MSCFixer/Features/Ads/LockScreenAds.cs b/src/MSCFixer/Features/Ads/LockScreenAds.cs index bd90296..9d5e63e 100644 --- a/src/MSCFixer/Features/Ads/LockScreenAds.cs +++ b/src/MSCFixer/Features/Ads/LockScreenAds.cs @@ -21,9 +21,9 @@ namespace Settings.Ads return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } - public override bool CheckFeature() + public override Task CheckFeature() { - return (Utils.IntEquals(keyName, valueName, recommendedValue) && + return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue) && Utils.IntEquals(keyName, valueName2, recommendedValue) ); } diff --git a/src/MSCFixer/Features/Ads/PersonalizedAds.cs b/src/MSCFixer/Features/Ads/PersonalizedAds.cs index b8e503b..102b3e9 100644 --- a/src/MSCFixer/Features/Ads/PersonalizedAds.cs +++ b/src/MSCFixer/Features/Ads/PersonalizedAds.cs @@ -20,9 +20,9 @@ namespace Settings.Ads return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } - public override bool CheckFeature() + public override Task CheckFeature() { - return Utils.IntEquals(keyName, valueName, 0); + return Task.FromResult(Utils.IntEquals(keyName, valueName, 0)); } public override Task DoFeature() diff --git a/src/MSCFixer/Features/Ads/SettingsAds.cs b/src/MSCFixer/Features/Ads/SettingsAds.cs index 507900b..6f24e95 100644 --- a/src/MSCFixer/Features/Ads/SettingsAds.cs +++ b/src/MSCFixer/Features/Ads/SettingsAds.cs @@ -23,9 +23,9 @@ namespace Settings.Ads return $"{keyName} | Value: {valueName} + {valueName2} + {valueName3} | Recommended Value: {recommendedValue}"; } - public override bool CheckFeature() + public override Task CheckFeature() { - return (Utils.IntEquals(keyName, valueName, recommendedValue) && + return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue) && Utils.IntEquals(keyName, valueName2, recommendedValue) && Utils.IntEquals(keyName, valueName3, recommendedValue) ); diff --git a/src/MSCFixer/Features/Ads/StartmenuAds.cs b/src/MSCFixer/Features/Ads/StartmenuAds.cs index a3a2d37..e2a8da6 100644 --- a/src/MSCFixer/Features/Ads/StartmenuAds.cs +++ b/src/MSCFixer/Features/Ads/StartmenuAds.cs @@ -26,9 +26,9 @@ namespace Settings.Ads return "This feature will disable ads in the start menu."; } - public override bool CheckFeature() + public override Task CheckFeature() { - return ( + return Task.FromResult( Utils.IntEquals(keyName, valueName, recommendedValue) ); } diff --git a/src/MSCFixer/Features/Ads/TailoredExperiences.cs b/src/MSCFixer/Features/Ads/TailoredExperiences.cs index 9c9935c..f0d6d95 100644 --- a/src/MSCFixer/Features/Ads/TailoredExperiences.cs +++ b/src/MSCFixer/Features/Ads/TailoredExperiences.cs @@ -26,9 +26,9 @@ namespace Settings.Ads return "Tailored Experiences allows Microsoft to get information from you to deliver personalized tips, ads, and recommendations. Many people would call this telemetry, or even spying."; } - public override bool CheckFeature() + public override Task CheckFeature() { - return ( + return Task.FromResult( Utils.IntEquals(keyName, valueName, recommendedValue) ); } diff --git a/src/MSCFixer/Features/Ads/TipsAndSuggestions.cs b/src/MSCFixer/Features/Ads/TipsAndSuggestions.cs index e480a9e..ba6e44c 100644 --- a/src/MSCFixer/Features/Ads/TipsAndSuggestions.cs +++ b/src/MSCFixer/Features/Ads/TipsAndSuggestions.cs @@ -20,9 +20,9 @@ namespace Settings.Ads return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } - public override bool CheckFeature() + public override Task CheckFeature() { - return (Utils.IntEquals(keyName, valueName, recommendedValue) + return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue) ); } diff --git a/src/MSCFixer/Features/Ads/WelcomeExperienceAds.cs b/src/MSCFixer/Features/Ads/WelcomeExperienceAds.cs index 4f655cd..6219414 100644 --- a/src/MSCFixer/Features/Ads/WelcomeExperienceAds.cs +++ b/src/MSCFixer/Features/Ads/WelcomeExperienceAds.cs @@ -20,9 +20,9 @@ namespace Settings.Ads return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } - public override bool CheckFeature() + public override Task CheckFeature() { - return Utils.IntEquals(keyName, valueName, 0); + return Task.FromResult(Utils.IntEquals(keyName, valueName, 0)); } public override Task DoFeature() diff --git a/src/MSCFixer/Features/Edge/BrowserSignin.cs b/src/MSCFixer/Features/Edge/BrowserSignin.cs index 98109ed..5235e0f 100644 --- a/src/MSCFixer/Features/Edge/BrowserSignin.cs +++ b/src/MSCFixer/Features/Edge/BrowserSignin.cs @@ -20,9 +20,9 @@ namespace Settings.Edge public override string Info() => "This setting controls whether a user can sign into Microsoft Edge with an account to use services such as sync and single sign on"; - public override bool CheckFeature() + public override Task CheckFeature() { - return Utils.IntEquals(keyName, valueName, recommendedValue); + return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() diff --git a/src/MSCFixer/Features/Edge/DefaultTopSites.cs b/src/MSCFixer/Features/Edge/DefaultTopSites.cs index dfbabd8..79b0c47 100644 --- a/src/MSCFixer/Features/Edge/DefaultTopSites.cs +++ b/src/MSCFixer/Features/Edge/DefaultTopSites.cs @@ -9,7 +9,7 @@ namespace Settings.Edge { private const string keyName = @"HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Edge"; private const string valueName = "NewTabPageHideDefaultTopSites"; - private const int recommendedValue = 0; + private const int recommendedValue = 1; public override string GetFeatureDetails() { @@ -20,16 +20,16 @@ namespace Settings.Edge public override string Info() => "Hide default top sites from the new tab page in Microsoft Edge"; - public override bool CheckFeature() + public override Task CheckFeature() { - return Utils.IntEquals(keyName, valueName, recommendedValue); + return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() { try { - Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.RegistryValueKind.DWord); + Registry.SetValue(keyName, valueName, recommendedValue, Microsoft.Win32.RegistryValueKind.DWord); return Task.FromResult(true); } @@ -45,7 +45,7 @@ namespace Settings.Edge { try { - Registry.SetValue(keyName, valueName, 1, Microsoft.Win32.RegistryValueKind.DWord); + Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.RegistryValueKind.DWord); return true; } diff --git a/src/MSCFixer/Features/Edge/DefautBrowserSetting.cs b/src/MSCFixer/Features/Edge/DefautBrowserSetting.cs index bf91eed..10b3ba9 100644 --- a/src/MSCFixer/Features/Edge/DefautBrowserSetting.cs +++ b/src/MSCFixer/Features/Edge/DefautBrowserSetting.cs @@ -20,9 +20,9 @@ namespace Settings.Edge public override string Info() => "Force Edge to stop asking to change default browser"; - public override bool CheckFeature() + public override Task CheckFeature() { - return Utils.IntEquals(keyName, valueName, recommendedValue); + return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() diff --git a/src/MSCFixer/Features/Edge/EdgeCollections.cs b/src/MSCFixer/Features/Edge/EdgeCollections.cs index 503a6e8..f8e0684 100644 --- a/src/MSCFixer/Features/Edge/EdgeCollections.cs +++ b/src/MSCFixer/Features/Edge/EdgeCollections.cs @@ -20,9 +20,9 @@ namespace Settings.Edge return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } - public override bool CheckFeature() + public override Task CheckFeature() { - return Utils.IntEquals(keyName, valueName, recommendedValue); + return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() diff --git a/src/MSCFixer/Features/Edge/EdgeShoppingAssistant.cs b/src/MSCFixer/Features/Edge/EdgeShoppingAssistant.cs index f3d1c38..270936e 100644 --- a/src/MSCFixer/Features/Edge/EdgeShoppingAssistant.cs +++ b/src/MSCFixer/Features/Edge/EdgeShoppingAssistant.cs @@ -20,9 +20,9 @@ namespace Settings.Edge public override string Info() => "Shopping in Microsoft Edge feature will automatically find you the best prices and coupons from across the web as you shop"; - public override bool CheckFeature() + public override Task CheckFeature() { - return Utils.IntEquals(keyName, valueName, recommendedValue); + return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() diff --git a/src/MSCFixer/Features/Edge/FirstRunExperience.cs b/src/MSCFixer/Features/Edge/FirstRunExperience.cs index 3513620..fe879a2 100644 --- a/src/MSCFixer/Features/Edge/FirstRunExperience.cs +++ b/src/MSCFixer/Features/Edge/FirstRunExperience.cs @@ -20,9 +20,9 @@ namespace Settings.Edge public override string Info() => "Hide home screen and 'Getting Started' on initial launch (from version 80 onwards)"; - public override bool CheckFeature() + public override Task CheckFeature() { - return Utils.IntEquals(keyName, valueName, recommendedValue); + return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() diff --git a/src/MSCFixer/Features/Edge/GamerMode.cs b/src/MSCFixer/Features/Edge/GamerMode.cs index 1675643..516f2f2 100644 --- a/src/MSCFixer/Features/Edge/GamerMode.cs +++ b/src/MSCFixer/Features/Edge/GamerMode.cs @@ -20,9 +20,9 @@ namespace Settings.Edge public override string Info() => "Microsoft Edge Gamer Mode allows gamers to personalize their browser with gaming themes and gives them the option of enabling Efficiency Mode for PC gaming, the Gaming feed on new tabs, sidebar apps for gamers, and more"; - public override bool CheckFeature() + public override Task CheckFeature() { - return Utils.IntEquals(keyName, valueName, recommendedValue); + return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() diff --git a/src/MSCFixer/Features/Edge/HubsSidebar.cs b/src/MSCFixer/Features/Edge/HubsSidebar.cs index a03e495..a2c8aca 100644 --- a/src/MSCFixer/Features/Edge/HubsSidebar.cs +++ b/src/MSCFixer/Features/Edge/HubsSidebar.cs @@ -20,9 +20,9 @@ namespace Settings.Edge public override string Info() => "This feature will disable Copilot in Microsoft Edge."; - public override bool CheckFeature() + public override Task CheckFeature() { - return Utils.IntEquals(keyName, valueName, 0); + return Task.FromResult(Utils.IntEquals(keyName, valueName, 0)); } public override Task DoFeature() diff --git a/src/MSCFixer/Features/Edge/ImportOnEachLaunch.cs b/src/MSCFixer/Features/Edge/ImportOnEachLaunch.cs index 88cd85d..51a01b6 100644 --- a/src/MSCFixer/Features/Edge/ImportOnEachLaunch.cs +++ b/src/MSCFixer/Features/Edge/ImportOnEachLaunch.cs @@ -20,9 +20,9 @@ namespace Settings.Edge public override string Info() => "Allow import of data from other browsers on each Microsoft Edge launch"; - public override bool CheckFeature() + public override Task CheckFeature() { - return Utils.IntEquals(keyName, valueName, recommendedValue); + return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() diff --git a/src/MSCFixer/Features/Edge/StartupBoost.cs b/src/MSCFixer/Features/Edge/StartupBoost.cs index 4c7ba79..94da358 100644 --- a/src/MSCFixer/Features/Edge/StartupBoost.cs +++ b/src/MSCFixer/Features/Edge/StartupBoost.cs @@ -20,9 +20,9 @@ namespace Settings.Edge public override string Info() => "Enables Microsoft Edge processes to initialize at operating system startup and restart in the background after the last browser window has been closed"; - public override bool CheckFeature() + public override Task CheckFeature() { - return Utils.IntEquals(keyName, valueName, recommendedValue); + return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() diff --git a/src/MSCFixer/Features/Edge/TabPageQuickLinks.cs b/src/MSCFixer/Features/Edge/TabPageQuickLinks.cs index e64685e..c106f28 100644 --- a/src/MSCFixer/Features/Edge/TabPageQuickLinks.cs +++ b/src/MSCFixer/Features/Edge/TabPageQuickLinks.cs @@ -20,9 +20,9 @@ namespace Settings.Edge public override string Info() => "By default, when you open a new tab, you see a Bing search bar, Bing image of the day set as the page background. For supported websites, Quick Links on the New Tab page can display recent updates right in the tile"; - public override bool CheckFeature() + public override Task CheckFeature() { - return Utils.IntEquals(keyName, valueName, recommendedValue); + return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() diff --git a/src/MSCFixer/Features/Edge/UserFeedback.cs b/src/MSCFixer/Features/Edge/UserFeedback.cs index b72d128..75789a1 100644 --- a/src/MSCFixer/Features/Edge/UserFeedback.cs +++ b/src/MSCFixer/Features/Edge/UserFeedback.cs @@ -20,9 +20,9 @@ namespace Settings.Edge public override string Info() => "Allow the submission of feedback, suggestions, or customer surveys, as well as reporting issues with the browser"; - public override bool CheckFeature() + public override Task CheckFeature() { - return Utils.IntEquals(keyName, valueName, recommendedValue); + return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() diff --git a/src/MSCFixer/Features/Gaming/GameDVR.cs b/src/MSCFixer/Features/Gaming/GameDVR.cs index 0d6d698..2c1b479 100644 --- a/src/MSCFixer/Features/Gaming/GameDVR.cs +++ b/src/MSCFixer/Features/Gaming/GameDVR.cs @@ -31,11 +31,11 @@ namespace Settings.Gaming return "This feature will disable Game DVR."; } - public override bool CheckFeature() + public override Task CheckFeature() { - return Utils.IntEquals(keyName, valueName, 0) && + return Task.FromResult(Utils.IntEquals(keyName, valueName, 0) && Utils.IntEquals(keyName, valueName2, 2) && - Utils.IntEquals(keyName2, valueName3, 0); + Utils.IntEquals(keyName2, valueName3, 0)); } public override Task DoFeature() diff --git a/src/MSCFixer/Features/Gaming/PowerThrotteling.cs b/src/MSCFixer/Features/Gaming/PowerThrotteling.cs index 3d1f5c6..1cd7aab 100644 --- a/src/MSCFixer/Features/Gaming/PowerThrotteling.cs +++ b/src/MSCFixer/Features/Gaming/PowerThrotteling.cs @@ -26,9 +26,9 @@ namespace Settings.Gaming return "This feature will disable Power Throttling."; } - public override bool CheckFeature() + public override Task CheckFeature() { - return Utils.IntEquals(keyName, valueName, recommendedValue); + return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() diff --git a/src/MSCFixer/Features/Gaming/VisualFX.cs b/src/MSCFixer/Features/Gaming/VisualFX.cs index 22d4b0f..a7e4ced 100644 --- a/src/MSCFixer/Features/Gaming/VisualFX.cs +++ b/src/MSCFixer/Features/Gaming/VisualFX.cs @@ -26,9 +26,9 @@ namespace Settings.Gaming return "This feature will disable visual effects in Windows."; } - public override bool CheckFeature() + public override Task CheckFeature() { - return Utils.IntEquals(keyName, valueName, 0); + return Task.FromResult(Utils.IntEquals(keyName, valueName, 0)); } public override Task DoFeature() diff --git a/src/MSCFixer/Features/Issues/BasicCleanup.cs b/src/MSCFixer/Features/Issues/BasicCleanup.cs index f4337ef..5edad37 100644 --- a/src/MSCFixer/Features/Issues/BasicCleanup.cs +++ b/src/MSCFixer/Features/Issues/BasicCleanup.cs @@ -16,7 +16,7 @@ namespace Settings.Issues public override string Info() => "Deletes all temporary files from the user's Temp folder. Then, the built-in Disk Cleanup utility (cleanmgr) is run."; - public override bool CheckFeature() + public override Task CheckFeature() { try { @@ -25,12 +25,12 @@ namespace Settings.Issues bool isOk = totalSize <= 50; - return isOk; + return Task.FromResult(isOk); } catch (Exception ex) { Logger.Log($"Error checking Temp folder: {ex.Message}", LogLevel.Error); - return false; + return Task.FromResult(false); } } diff --git a/src/MSCFixer/Features/Issues/WingetUpgrade.cs b/src/MSCFixer/Features/Issues/WingetUpgrade.cs new file mode 100644 index 0000000..8da64db --- /dev/null +++ b/src/MSCFixer/Features/Issues/WingetUpgrade.cs @@ -0,0 +1,125 @@ +using System; +using System.Diagnostics; +using System.Threading.Tasks; +using Crapfixer; + +namespace Settings.System +{ + internal class WingetUpgradeAll : FeatureBase + { + public override string GetFeatureDetails() + { + return "Launches Windows Terminal to check and upgrade all installed apps via winget."; + } + + public override string ID() + { + return "Winget App Updates"; + } + + public override string Info() + { + return "Automatically searches for available app updates using the Windows package manager 'winget' and installs them in a new Windows Terminal window. It runs 'winget upgrade --include-unknown' to list all available updates, including manually installed apps, and then 'winget upgrade --all --include-unknown' to install them. No manual interaction is required."; + } + + public override async Task CheckFeature() + { + Logger.Log("📦 Checking all available updates via winget...", LogLevel.Warning); + Logger.Log("This may take a while, please be patient.", LogLevel.Warning); + + try + { + string output = await ExecuteCommand("winget upgrade --include-unknown"); + + Logger.Log("Winget upgrade check:\n" + output, LogLevel.Info); + + return output.ToLower().Contains("available"); + } + catch (Exception ex) + { + Logger.Log("Winget check failed: " + ex.Message, LogLevel.Error); + return false; + } + } + + public override Task DoFeature() + { + return Task.Factory.StartNew(() => + { + try + { + LaunchInTerminal("winget upgrade --all --include-unknown"); + return true; + } + catch (Exception ex) + { + Logger.Log("Failed to run winget upgrade: " + ex.Message, LogLevel.Error); + return false; + } + }); + } + + public override bool UndoFeature() + { + Logger.Log("Winget upgrades cannot be undone.", LogLevel.Warning); + return false; + } + + private void LaunchInTerminal(string command) + { + var startInfo = new ProcessStartInfo + { + FileName = "wt.exe", + Arguments = "-w 0 nt -p \"Windows PowerShell\" powershell -NoExit -Command \"" + command + "\"", + UseShellExecute = true + }; + + Process.Start(startInfo); + } + + private Task ExecuteCommand(string command) + { + var tcs = new TaskCompletionSource(); + + try + { + var startInfo = new ProcessStartInfo + { + FileName = "cmd.exe", + Arguments = "/c " + command, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true + }; + + var process = new Process(); + process.StartInfo = startInfo; + + string output = ""; + + process.OutputDataReceived += (sender, args) => + { + if (args.Data != null) + output += args.Data + Environment.NewLine; + }; + + process.EnableRaisingEvents = true; + process.Exited += (sender, args) => + { + tcs.TrySetResult(output); + process.Dispose(); + }; + + process.Start(); + process.BeginOutputReadLine(); + } + catch (Exception ex) + { + tcs.TrySetException(ex); + } + + return tcs.Task; + } + } +} diff --git a/src/MSCFixer/Features/Privacy/ActivityHistory.cs b/src/MSCFixer/Features/Privacy/ActivityHistory.cs index 99910db..29b2810 100644 --- a/src/MSCFixer/Features/Privacy/ActivityHistory.cs +++ b/src/MSCFixer/Features/Privacy/ActivityHistory.cs @@ -26,9 +26,9 @@ namespace Settings.Privacy return "Disable activity history (prevents Windows from tracking and storing your activity)"; } - public override bool CheckFeature() + public override Task CheckFeature() { - return ( + return Task.FromResult( Utils.IntEquals(keyName, valueName, recommendedValue) ); } diff --git a/src/MSCFixer/Features/Privacy/LocationTracking.cs b/src/MSCFixer/Features/Privacy/LocationTracking.cs index 7dec042..55f793a 100644 --- a/src/MSCFixer/Features/Privacy/LocationTracking.cs +++ b/src/MSCFixer/Features/Privacy/LocationTracking.cs @@ -26,9 +26,9 @@ namespace Settings.Privacy return "Disable location tracking (prevents Windows from accessing your location)"; } - public override bool CheckFeature() + public override Task CheckFeature() { - return Utils.IntEquals(keyName, valueName, recommendedValue); + return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() diff --git a/src/MSCFixer/Features/Privacy/PrivacyExperience.cs b/src/MSCFixer/Features/Privacy/PrivacyExperience.cs index f2a4cd4..ae11f95 100644 --- a/src/MSCFixer/Features/Privacy/PrivacyExperience.cs +++ b/src/MSCFixer/Features/Privacy/PrivacyExperience.cs @@ -20,11 +20,13 @@ namespace Settings.Privacy return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } - public override bool CheckFeature() + public override Task CheckFeature() { - return !Utils.IntEquals(keyName, valueName, recommendedValue); + bool result = !Utils.IntEquals(keyName, valueName, recommendedValue); + return Task.FromResult(result); } + public override Task DoFeature() { try diff --git a/src/MSCFixer/Features/Privacy/Telemetry.cs b/src/MSCFixer/Features/Privacy/Telemetry.cs index e37d4bd..3698d57 100644 --- a/src/MSCFixer/Features/Privacy/Telemetry.cs +++ b/src/MSCFixer/Features/Privacy/Telemetry.cs @@ -19,11 +19,11 @@ namespace Settings.Privacy return $"{dataCollection} | {diagTrack}"; } - public override bool CheckFeature() + public override Task CheckFeature() { - return ( + return Task.FromResult( Utils.IntEquals(dataCollection, "AllowTelemetry", 0) && - Utils.IntEquals(diagTrack, "Start", 2) + Utils.IntEquals(diagTrack, "Start", 4) ); } diff --git a/src/MSCFixer/Features/System/BSODDetails.cs b/src/MSCFixer/Features/System/BSODDetails.cs index c387e8e..2da5227 100644 --- a/src/MSCFixer/Features/System/BSODDetails.cs +++ b/src/MSCFixer/Features/System/BSODDetails.cs @@ -27,9 +27,9 @@ namespace Settings.System return "This method displays the full classic BSOD with technical error details instead of the simplified sad face version."; } - public override bool CheckFeature() + public override Task CheckFeature() { - return ( + return Task.FromResult( Utils.IntEquals(keyName, valueName1, recommendedValue) && Utils.IntEquals(keyName, valueName2, recommendedValue) ); diff --git a/src/MSCFixer/Features/System/MenuShowDelay.cs b/src/MSCFixer/Features/System/MenuShowDelay.cs index d34f4bb..52c2dc8 100644 --- a/src/MSCFixer/Features/System/MenuShowDelay.cs +++ b/src/MSCFixer/Features/System/MenuShowDelay.cs @@ -26,9 +26,9 @@ namespace Settings.System return "Speeds up the appearance of menus and submenus by lowering the default delay. This improves the perceived responsiveness of the UI."; } - public override bool CheckFeature() + public override Task CheckFeature() { - return Utils.StringEquals(keyName, valueName, recommendedValue); + return Task.FromResult(Utils.StringEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() diff --git a/src/MSCFixer/Features/System/NetworkThrottling.cs b/src/MSCFixer/Features/System/NetworkThrottling.cs index 47e294d..eac879a 100644 --- a/src/MSCFixer/Features/System/NetworkThrottling.cs +++ b/src/MSCFixer/Features/System/NetworkThrottling.cs @@ -26,9 +26,9 @@ namespace Settings.System return "Disables the Windows network throttling mechanism to potentially improve performance for streaming, gaming, or real-time applications."; } - public override bool CheckFeature() + public override Task CheckFeature() { - return Utils.IntEquals(keyName, valueName, unchecked((int)0xFFFFFFFF)); + return Task.FromResult(Utils.IntEquals(keyName, valueName, unchecked((int)0xFFFFFFFF))); } public override Task DoFeature() diff --git a/src/MSCFixer/Features/System/SpeedUpShutdown.cs b/src/MSCFixer/Features/System/SpeedUpShutdown.cs index 93ef822..a87801a 100644 --- a/src/MSCFixer/Features/System/SpeedUpShutdown.cs +++ b/src/MSCFixer/Features/System/SpeedUpShutdown.cs @@ -26,9 +26,9 @@ namespace Settings.System return "This feature reduces the WaitToKillServiceTimeout value, which speeds up the shutdown process by reducing the time Windows waits for services to stop."; } - public override bool CheckFeature() + public override Task CheckFeature() { - return ( + return Task.FromResult( Utils.StringEquals(keyName, valueName, recommendedValue) ); } diff --git a/src/MSCFixer/Features/System/SystemResponsiveness.cs b/src/MSCFixer/Features/System/SystemResponsiveness.cs index 93536e9..62e6d84 100644 --- a/src/MSCFixer/Features/System/SystemResponsiveness.cs +++ b/src/MSCFixer/Features/System/SystemResponsiveness.cs @@ -26,9 +26,9 @@ namespace Settings.System return "Enhances system responsiveness by prioritizing CPU resources for foreground tasks, improving performance during active use."; } - public override bool CheckFeature() + public override Task CheckFeature() { - return Utils.IntEquals(keyName, valueName, recommendedValue); + return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() diff --git a/src/MSCFixer/Features/System/VerboseStatus.cs b/src/MSCFixer/Features/System/VerboseStatus.cs index 9ddf566..51de9a5 100644 --- a/src/MSCFixer/Features/System/VerboseStatus.cs +++ b/src/MSCFixer/Features/System/VerboseStatus.cs @@ -26,9 +26,9 @@ namespace Settings.System return "This method allows you to see what processes are hanging when shutting down and turning on the machine."; } - public override bool CheckFeature() + public override Task CheckFeature() { - return ( + return Task.FromResult( Utils.IntEquals(keyName, valueName, recommendedValue) ); } diff --git a/src/MSCFixer/Features/UI/DarkMode.cs b/src/MSCFixer/Features/UI/DarkMode.cs index cbd3782..f0b02ef 100644 --- a/src/MSCFixer/Features/UI/DarkMode.cs +++ b/src/MSCFixer/Features/UI/DarkMode.cs @@ -26,9 +26,9 @@ namespace Settings.Personalization return "This feature enables Dark Mode for apps in Windows 11."; } - public override bool CheckFeature() + public override Task CheckFeature() { - return ( + return Task.FromResult( Utils.IntEquals(keyName, valueName, recommendedValue) ); } @@ -85,9 +85,9 @@ namespace Settings.Personalization return "This feature enables Dark Mode for Windows system UI (e.g., taskbar, start menu)."; } - public override bool CheckFeature() + public override Task CheckFeature() { - return ( + return Task.FromResult( Utils.IntEquals(keyName, valueName, recommendedValue) ); } diff --git a/src/MSCFixer/Features/UI/FullContextMenus.cs b/src/MSCFixer/Features/UI/FullContextMenus.cs index 717697d..a427137 100644 --- a/src/MSCFixer/Features/UI/FullContextMenus.cs +++ b/src/MSCFixer/Features/UI/FullContextMenus.cs @@ -24,17 +24,17 @@ namespace Settings.Personalization return "This feature will enable full context menus"; } - public override bool CheckFeature() + public override Task CheckFeature() { try { object value = Registry.GetValue(keyName, "", null); - return value != null; // Return true if value is not null + return Task.FromResult(value != null); // Return true if value is not null } catch (Exception ex) { Logger.Log("Error occurred while checking: " + ex.Message, LogLevel.Error); - return false; + return Task.FromResult(false); } } diff --git a/src/MSCFixer/Features/UI/LockScreen.cs b/src/MSCFixer/Features/UI/LockScreen.cs index 098da5a..dfcb7fa 100644 --- a/src/MSCFixer/Features/UI/LockScreen.cs +++ b/src/MSCFixer/Features/UI/LockScreen.cs @@ -26,13 +26,13 @@ namespace Settings.Personalization return "This feature will disable the personalized lock screen."; } - public override bool CheckFeature() + public override Task CheckFeature() { - return !( - Utils.IntEquals(keyName, valueName, recommendedValue) - ); + bool result = !Utils.IntEquals(keyName, valueName, recommendedValue); + return Task.FromResult(result); } + public override Task DoFeature() { try diff --git a/src/MSCFixer/Features/UI/SearchBoxSuggestions.cs b/src/MSCFixer/Features/UI/SearchBoxSuggestions.cs index 8ba9ce1..e1efa7c 100644 --- a/src/MSCFixer/Features/UI/SearchBoxSuggestions.cs +++ b/src/MSCFixer/Features/UI/SearchBoxSuggestions.cs @@ -26,9 +26,9 @@ namespace Settings.UI return "This feature disables Bing search and web suggestions in the Windows Start Menu."; } - public override bool CheckFeature() + public override Task CheckFeature() { - return Utils.IntEquals(keyName, valueName, recommendedValue); + return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() diff --git a/src/MSCFixer/Features/UI/SearchboxTaskbarMode.cs b/src/MSCFixer/Features/UI/SearchboxTaskbarMode.cs index e094195..caf798e 100644 --- a/src/MSCFixer/Features/UI/SearchboxTaskbarMode.cs +++ b/src/MSCFixer/Features/UI/SearchboxTaskbarMode.cs @@ -26,9 +26,9 @@ namespace Settings.Personalization return "This feature will hide search box on taskbar"; } - public override bool CheckFeature() + public override Task CheckFeature() { - return ( + return Task.FromResult( Utils.IntEquals(keyName, valueName, recommendedValue) ); } diff --git a/src/MSCFixer/Features/UI/ShowOrHideMostUsedApps.cs b/src/MSCFixer/Features/UI/ShowOrHideMostUsedApps.cs index 350b448..b1d44e1 100644 --- a/src/MSCFixer/Features/UI/ShowOrHideMostUsedApps.cs +++ b/src/MSCFixer/Features/UI/ShowOrHideMostUsedApps.cs @@ -9,7 +9,7 @@ namespace Settings.Personalization { private const string keyName = @"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Explorer"; private const string valueName = "ShowOrHideMostUsedApps"; - private const int recommendedValue = 0; + private const int recommendedValue = 2; public override string GetFeatureDetails() { @@ -23,12 +23,12 @@ namespace Settings.Personalization public override string Info() { - return "This feature will hide Most used apps in start menu"; + return "This feature will hide Most used apps in start menu for all users"; } - public override bool CheckFeature() + public override Task CheckFeature() { - return ( + return Task.FromResult( Utils.IntEquals(keyName, valueName, recommendedValue) ); } @@ -37,7 +37,7 @@ namespace Settings.Personalization { try { - Registry.SetValue(keyName, valueName, 0, RegistryValueKind.DWord); + Registry.SetValue(keyName, valueName, recommendedValue, RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) @@ -52,7 +52,7 @@ namespace Settings.Personalization { try { - Registry.SetValue(keyName, valueName, 2, RegistryValueKind.DWord); + Registry.SetValue(keyName, valueName, 1, RegistryValueKind.DWord); return true; } catch (Exception ex) diff --git a/src/MSCFixer/Features/UI/ShowTaskViewButton.cs b/src/MSCFixer/Features/UI/ShowTaskViewButton.cs index dffd9c7..60c953b 100644 --- a/src/MSCFixer/Features/UI/ShowTaskViewButton.cs +++ b/src/MSCFixer/Features/UI/ShowTaskViewButton.cs @@ -26,9 +26,9 @@ namespace Settings.Personalization return "This feature will hide the Task view button on taskbar"; } - public override bool CheckFeature() + public override Task CheckFeature() { - return ( + return Task.FromResult( Utils.IntEquals(keyName, valueName, recommendedValue) ); } diff --git a/src/MSCFixer/Features/UI/SnapAssistFlyout.cs b/src/MSCFixer/Features/UI/SnapAssistFlyout.cs index 10a03b9..718c942 100644 --- a/src/MSCFixer/Features/UI/SnapAssistFlyout.cs +++ b/src/MSCFixer/Features/UI/SnapAssistFlyout.cs @@ -26,9 +26,9 @@ namespace Settings.Personalization return "This feature disables the Snap Assist flyout, which appears when you snap a window."; } - public override bool CheckFeature() + public override Task CheckFeature() { - return ( + return Task.FromResult( Utils.IntEquals(keyName, valueName, recommendedValue) ); } diff --git a/src/MSCFixer/Features/UI/StartLayout.cs b/src/MSCFixer/Features/UI/StartLayout.cs index c2012d1..431ad41 100644 --- a/src/MSCFixer/Features/UI/StartLayout.cs +++ b/src/MSCFixer/Features/UI/StartLayout.cs @@ -26,9 +26,9 @@ namespace Settings.Personalization return "This feature will allow pinning more Apps on start menu"; } - public override bool CheckFeature() + public override Task CheckFeature() { - return ( + return Task.FromResult( Utils.IntEquals(keyName, valueName, recommendedValue) ); } diff --git a/src/MSCFixer/Features/UI/TaskbarAlignment.cs b/src/MSCFixer/Features/UI/TaskbarAlignment.cs index f5f0070..f1f8275 100644 --- a/src/MSCFixer/Features/UI/TaskbarAlignment.cs +++ b/src/MSCFixer/Features/UI/TaskbarAlignment.cs @@ -27,9 +27,9 @@ namespace Settings.Personalization return "This feature will align the Start button to left"; } - public override bool CheckFeature() + public override Task CheckFeature() { - return ( + return Task.FromResult( Utils.IntEquals(keyName, valueName, recommendedValue) ); } diff --git a/src/MSCFixer/Features/UI/Transparency.cs b/src/MSCFixer/Features/UI/Transparency.cs index e7d6ead..ce0ce4b 100644 --- a/src/MSCFixer/Features/UI/Transparency.cs +++ b/src/MSCFixer/Features/UI/Transparency.cs @@ -27,9 +27,9 @@ namespace Settings.Personalization return "This feature disables transparency effects for Start menu, taskbar, and other surfaces."; } - public override bool CheckFeature() + public override Task CheckFeature() { - return ( + return Task.FromResult( Utils.IntEquals(keyName, valueName, recommendedValue) ); } diff --git a/src/MSCFixer/Helpers/HelperTool.cs b/src/MSCFixer/Helpers/HelperTool.cs deleted file mode 100644 index 318da56..0000000 --- a/src/MSCFixer/Helpers/HelperTool.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.IO; -using System.Windows.Forms; - -namespace HelperTool -{ - internal class Utils - - { - public static class Data - { - public static string DataRootDir = Application.StartupPath + - @"\app\"; - } - - // Create data directory if non present - public static void CreateDataDir() - { - bool dirExists = Directory.Exists(@"app"); - if (!dirExists) - Directory.CreateDirectory(@"app"); - } - } -} \ No newline at end of file diff --git a/src/MSCFixer/Program.cs b/src/MSCFixer/Program.cs new file mode 100644 index 0000000..745bf14 --- /dev/null +++ b/src/MSCFixer/Program.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Crapfixer +{ + internal static class Program + { + /// + /// Get app version + /// + internal static string GetCurrentVersionTostring() => new Version(Application.ProductVersion).ToString(3); + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MainForm()); + } + } +} diff --git a/src/MSCFixer/Properties/AssemblyInfo.cs b/src/MSCFixer/Properties/AssemblyInfo.cs index 8efe461..1e5d46b 100644 --- a/src/MSCFixer/Properties/AssemblyInfo.cs +++ b/src/MSCFixer/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, // indem Sie "*" wie unten gezeigt eingeben: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.31.101")] -[assembly: AssemblyFileVersion("0.31.101")] +[assembly: AssemblyVersion("0.40.124")] +[assembly: AssemblyFileVersion("0.40.124")] diff --git a/src/MSCFixer/app.manifest b/src/MSCFixer/app.manifest new file mode 100644 index 0000000..f8a144b --- /dev/null +++ b/src/MSCFixer/app.manifest @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + + + + + + + +