Push 1.1-prev

This commit is contained in:
Belim
2025-05-21 17:11:38 +02:00
parent f7a8c2311c
commit 5ba8b099a1
97 changed files with 1698 additions and 426 deletions
+1 -1
View File
@@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.10.34928.147
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MSCFixer", "MSCFixer\MSCFixer.csproj", "{FA7D5C89-63D3-4AF0-80C2-D650D35E575B}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CFixer", "CFixer\CFixer.csproj", "{FA7D5C89-63D3-4AF0-80C2-D650D35E575B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
+5 -5
View File
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8.1"/>
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
</configuration>

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Before

Width:  |  Height:  |  Size: 914 B

After

Width:  |  Height:  |  Size: 914 B

@@ -7,8 +7,9 @@ using System.Threading.Tasks;
using Windows.Foundation;
using Windows.Management.Deployment;
namespace Crapfixer
namespace CrapFixer
{
public class AppAnalysisResult
{
public string AppName { get; set; }
@@ -55,7 +56,7 @@ namespace Crapfixer
Logger.Log("Bloatware apps detected:", LogLevel.Info);
foreach (var app in apps)
{
Logger.Log($"❌ {app.AppName} [{app.FullName}]", LogLevel.Warning);
Logger.Log($"❌ [ Bloatware ] {app.AppName} ({app.FullName})", LogLevel.Warning);
}
}
else
@@ -179,11 +180,12 @@ namespace Crapfixer
try
{
string exeDir = AppDomain.CurrentDomain.BaseDirectory;
string fullPath = Path.Combine(exeDir, fileName);
string pluginsDir = Path.Combine(exeDir, "plugins");
string fullPath = Path.Combine(pluginsDir, fileName);
if (!File.Exists(fullPath))
{
Logger.Log($"⚠️ The bloatware radar stays basic for now 🧠. Get the enhanced detection list from the GitHub releases (Assets).", LogLevel.Warning);
Logger.Log($"⚠️ The bloatware radar stays basic for now 🧠. Get the CFEnhancer detection list from Options > Plugins ", LogLevel.Warning);
return Array.Empty<string>();
}
@@ -6,12 +6,13 @@
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{FA7D5C89-63D3-4AF0-80C2-D650D35E575B}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>MSCFixer</RootNamespace>
<AssemblyName>MSCFixer</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<RootNamespace>CFixer</RootNamespace>
<AssemblyName>CFixer</AssemblyName>
<TargetFrameworkVersion>v4.8.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>x64</PlatformTarget>
@@ -56,6 +57,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="AppManagerService.cs" />
<Compile Include="Features\AI\AskCopilot.cs" />
<Compile Include="Features\FeatureManager.cs" />
<Compile Include="Features\Edge\BrowserSignin.cs" />
<Compile Include="Features\Edge\DefaultTopSites.cs" />
@@ -75,10 +77,13 @@
<Compile Include="Features\System\NetworkThrottling.cs" />
<Compile Include="Features\System\SpeedUpShutdown.cs" />
<Compile Include="Features\System\SystemResponsiveness.cs" />
<Compile Include="Features\System\TaskbarEndTask.cs" />
<Compile Include="Features\UI\DarkMode.cs" />
<Compile Include="Features\UI\SearchBoxSuggestions.cs" />
<Compile Include="Features\UI\SnapAssistFlyout.cs" />
<Compile Include="Features\UI\Transparency.cs" />
<Compile Include="Helpers\LogActions.cs" />
<Compile Include="Helpers\LogActionsController.cs" />
<Compile Include="Helpers\OSHelper.cs" />
<Compile Include="Helpers\Utils.cs" />
<Compile Include="Helpers\Logger.cs" />
@@ -129,6 +134,12 @@
<Compile Include="Views\AboutView.Designer.cs">
<DependentUpon>AboutView.cs</DependentUpon>
</Compile>
<Compile Include="Views\PluginsView.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Views\PluginsView.Designer.cs">
<DependentUpon>PluginsView.cs</DependentUpon>
</Compile>
<Compile Include="Views\SettingsView.cs">
<SubType>UserControl</SubType>
</Compile>
@@ -152,6 +163,9 @@
<EmbeddedResource Include="Views\AboutView.resx">
<DependentUpon>AboutView.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Views\PluginsView.resx">
<DependentUpon>PluginsView.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Views\SettingsView.resx">
<DependentUpon>SettingsView.cs</DependentUpon>
</EmbeddedResource>
+78
View File
@@ -0,0 +1,78 @@
using Microsoft.Win32;
using System;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.AI
{
internal class AskCopilot : FeatureBase
{
private const string keyPath = @"Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked";
private const string fullKeyPath = @"HKEY_CURRENT_USER\" + keyPath;
private const string valueName = "{CB3B0003-8088-4EDE-8769-8B354AB2FF8C}";
private const string displayValue = "Ask Copilot";
public override string GetFeatureDetails()
{
return $"{fullKeyPath} | Value: {valueName} = \"{displayValue}\" | Blocks Copilot context menu entry.";
}
public override string ID()
{
return "Remove Ask Copilot from context menu";
}
public override string Info()
{
return "Blocks the 'Ask Copilot' entry in the Windows 11 context menu by disabling its Shell Extension.";
}
public override Task<bool> CheckFeature()
{
using (RegistryKey key = Registry.CurrentUser.OpenSubKey(keyPath))
{
if (key == null) return Task.FromResult(false);
object value = key.GetValue(valueName);
return Task.FromResult(value != null && value.ToString() == displayValue);
}
}
public override Task<bool> DoFeature()
{
try
{
using (RegistryKey key = Registry.CurrentUser.CreateSubKey(keyPath))
{
key.SetValue(valueName, displayValue, RegistryValueKind.String);
}
Logger.Log("'Ask Copilot' context menu entry has been blocked.", LogLevel.Info);
return Task.FromResult(true);
}
catch (Exception ex)
{
Logger.Log("Error blocking Copilot context menu: " + ex.Message, LogLevel.Error);
return Task.FromResult(false);
}
}
public override bool UndoFeature()
{
try
{
using (RegistryKey key = Registry.CurrentUser.OpenSubKey(keyPath, writable: true))
{
key?.DeleteValue(valueName, false);
}
Logger.Log("'Ask Copilot' context menu entry has been restored.", LogLevel.Info);
return true;
}
catch (Exception ex)
{
Logger.Log("Error restoring Copilot context menu: " + ex.Message, LogLevel.Error);
return false;
}
}
}
}
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.AI
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.AI
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Ads
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Ads
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Ads
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Ads
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Ads
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Ads
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Ads
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Ads
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Ads
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Edge
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Edge
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Edge
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Edge
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Edge
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Edge
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Edge
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Edge
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Edge
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Edge
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Edge
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Edge
@@ -1,6 +1,6 @@
using System.Threading.Tasks;
namespace Crapfixer
namespace CrapFixer
{
public abstract class FeatureBase
{
@@ -36,6 +36,7 @@ namespace Features
new FeatureNode(new NetworkThrottling()),
new FeatureNode(new SystemResponsiveness()),
new FeatureNode(new MenuShowDelay()),
new FeatureNode(new TaskbarEndTask()),
}
},
@@ -120,6 +121,7 @@ namespace Features
{
new FeatureNode(new CopilotTaskbar()),
new FeatureNode(new Recall()),
new FeatureNode(new AskCopilot()),
}
},
};
@@ -4,7 +4,7 @@ using System.Drawing;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Crapfixer
namespace CrapFixer
{
/// <summary>
/// Provides operations to load, analyze, fix, restore, and show help for FeatureNodes.
@@ -222,6 +222,30 @@ namespace Crapfixer
}
}
/// <summary>
/// Recursively previews changes for all checked features.
/// </summary>
/// <param name="node"></param>
public static void PreviewChanges(TreeNode node)
{
if (node.Tag is FeatureNode fn)
{
if (!fn.IsCategory && fn.Feature != null)
{
string details = fn.Feature.GetFeatureDetails();
string category = node.Parent?.Text ?? "General";
Logger.Log($"🛈 [PREVIEW] [{category}] {fn.Name}", LogLevel.Info);
Logger.Log($" ➤ {details}");
Logger.Log(new string('-', 50), LogLevel.Info);
}
foreach (TreeNode child in node.Nodes)
PreviewChanges(child);
}
}
/// <summary>
/// Displays help information for the selected feature.
/// </summary>
@@ -1,5 +1,5 @@
using System.Collections.Generic;
using Crapfixer;
using CrapFixer;
public class FeatureNode
{
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Gaming
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Gaming
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Gaming
@@ -3,7 +3,7 @@ using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Diagnostics;
using Crapfixer;
using CrapFixer;
namespace Settings.Issues
{
@@ -1,7 +1,7 @@
using System;
using System.Diagnostics;
using System.Threading.Tasks;
using Crapfixer;
using CrapFixer;
namespace Settings.System
{
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Privacy
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Privacy
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Privacy
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Privacy
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.System
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.System
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.System
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.System
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.System
+64
View File
@@ -0,0 +1,64 @@
using Microsoft.Win32;
using System;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.System
{
internal class TaskbarEndTask : FeatureBase
{
private const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\TaskbarDeveloperSettings";
private const string valueName = "TaskbarEndTask";
private const int recommendedValue = 1;
public override string GetFeatureDetails()
{
return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}";
}
public override string ID()
{
return "Enable End Task";
}
public override string Info()
{
return "Adds 'End Task' to the Windows 11 taskbar context menu, allowing you to directly kill unresponsive apps.";
}
public override Task<bool> CheckFeature()
{
return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue));
}
public override Task<bool> DoFeature()
{
try
{
Registry.SetValue(keyName, valueName, recommendedValue, RegistryValueKind.DWord);
return Task.FromResult(true);
}
catch (Exception ex)
{
Logger.Log("Failed to enable End Task: " + ex.Message, LogLevel.Error);
}
return Task.FromResult(false);
}
public override bool UndoFeature()
{
try
{
Registry.SetValue(keyName, valueName, 0, RegistryValueKind.DWord);
return true;
}
catch (Exception ex)
{
Logger.Log("Failed to disable End Task: " + ex.Message, LogLevel.Error);
}
return false;
}
}
}
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.System
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Personalization
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Personalization
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Personalization
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.UI
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Personalization
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Personalization
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Personalization
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Personalization
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Personalization
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Personalization
@@ -1,6 +1,6 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using CrapFixer;
using System.Threading.Tasks;
namespace Settings.Personalization
+54
View File
@@ -0,0 +1,54 @@
using System;
using System.Diagnostics;
using System.Windows.Forms;
/// <summary>
/// Provides actions for interacting with and managing the content of a log displayed in a <see cref="RichTextBox"/>.
/// </summary>
/// <remarks>This class allows users to perform common operations on a log, such as copying its content to the
/// clipboard, analyzing it using the CrapFixer online analyzer tool, or clearing the log. It is designed to work with a <see
/// cref="RichTextBox"/> control that serves as the log display.</remarks>
public sealed class LogActions
{
private readonly RichTextBox _logBox;
public LogActions(RichTextBox logBox)
{
_logBox = logBox ?? throw new ArgumentNullException(nameof(logBox));
}
/// <summary>Copies the whole log to the clipboard.</summary>
public void CopyToClipboard()
{
var text = _logBox.Text;
if (!string.IsNullOrEmpty(text))
Clipboard.SetText(text);
}
/// <summary>Opens CrapFixer online analyzer tool and passes the log via URL‑encoded GET parameter.</summary>
public void AnalyzeOnline(string baseUrl)
{
if (string.IsNullOrWhiteSpace(baseUrl)) return;
// Get the current log text
var logText = _logBox.Text;
if (string.IsNullOrEmpty(logText)) return;
// Copy the log to the cboard
Clipboard.SetText(logText);
Process.Start(baseUrl);
MessageBox.Show(
"The log has been copied to the clipboard.\n" +
"Click “Paste log from clipboard” on the log analyzer page, or simply press CTRL+V,\n" +
"to insert it into the analyzer.",
"Log copied",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
/// <summary>Clears the logger output.</summary>
public void Clear()
=> _logBox.Clear();
}
+67
View File
@@ -0,0 +1,67 @@
using System;
using System.Windows.Forms;
/// <summary>
/// Manages log-related actions using a ComboBox in MainForm.
/// </summary>
public class LogActionsController
{
private readonly ComboBox _combo;
private readonly LogActions _logActions;
public LogActionsController(ComboBox comboLogActions, LogActions logActions)
{
if (comboLogActions == null) throw new ArgumentNullException(nameof(comboLogActions));
if (logActions == null) throw new ArgumentNullException(nameof(logActions));
_combo = comboLogActions;
_logActions = logActions;
Initialize();
}
private void Initialize()
{
_combo.Items.Clear();
_combo.Items.Add("Select an action...");
_combo.Items.Add("Analyze log online (recommended)");
_combo.Items.Add("Copy log to clipboard");
_combo.Items.Add("Clear log");
_combo.SelectedIndex = 0;
_combo.SelectedIndexChanged += Combo_SelectedIndexChanged;
}
private void Combo_SelectedIndexChanged(object sender, EventArgs e)
{
string selected = _combo.SelectedItem as string;
if (string.IsNullOrEmpty(selected))
{
Reset();
return;
}
switch (selected)
{
case "Analyze log online (recommended)":
_logActions.AnalyzeOnline("https://builtbybel.github.io/CrapFixer/log-analyzer/index.html");
break;
case "Copy log to clipboard":
_logActions.CopyToClipboard();
break;
case "Clear log":
_logActions.Clear();
break;
}
Reset();
}
private void Reset()
{
// Reset the combo box to the default selection
_combo.SelectedIndex = 0;
}
}
@@ -3,7 +3,7 @@ using System.Management.Automation;
using System.Threading.Tasks;
using Microsoft.Win32;
// This file is part of MSCFixer.
// This file is part of CFixer.
namespace OSHelper
{
internal class OSHelper
@@ -1,12 +1,10 @@
using Microsoft.Win32;
using System.Windows.Forms;
using System;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Windows.Forms;
// This file is part of MSCFixer.
namespace Crapfixer
// This file is part of CFixer.
namespace CrapFixer
{
internal class Utils
{
+200
View File
@@ -0,0 +1,200 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
public static class IniStateManager
{
// CrapFixer.ini path
private static readonly string IniPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "CrapFixer.ini");
private static readonly object FileLock = new object();
// Saves the global states (App size, TreeView nodes states)
public static void Save(TreeView tree, Form form)
{
lock (FileLock)
{
// Read existing lines if file exists
var lines = File.Exists(IniPath) ? File.ReadAllLines(IniPath).ToList() : new List<string>();
// Remove old APP and FEATURES sections
RemoveSection(lines, "APP");
RemoveSection(lines, "FEATURES");
// Append new APP section
lines.Add("[APP]");
lines.Add($"Width={form.Width}");
lines.Add($"Height={form.Height}");
lines.Add(""); // empty line for spacing
// Append new FEATURES section (TreeView nodes states)
lines.Add("[FEATURES]");
AppendNodeStates(lines, tree.Nodes);
// Write all back
File.WriteAllLines(IniPath, lines);
}
}
// Removes a section from the INI content
private static void RemoveSection(List<string> lines, string sectionName)
{
int start = lines.FindIndex(l => l.Trim().Equals($"[{sectionName}]", StringComparison.OrdinalIgnoreCase));
if (start < 0) return;
int end = start + 1;
while (end < lines.Count && !lines[end].TrimStart().StartsWith("["))
end++;
lines.RemoveRange(start, end - start);
}
// Helper to write TreeNode states to a list of strings
private static void AppendNodeStates(List<string> lines, TreeNodeCollection nodes)
{
foreach (TreeNode node in nodes)
{
lines.Add($"{node.Text.Trim()}={node.Checked}");
if (node.Nodes.Count > 0)
AppendNodeStates(lines, node.Nodes);
}
}
// Loads global states (App size, TreeView nodes states) from the INI file
public static void Load(TreeView tree, Form form)
{
if (!File.Exists(IniPath)) return;
var lines = File.ReadAllLines(IniPath);
var section = "";
var states = new Dictionary<string, bool>();
foreach (var line in lines)
{
var trimmed = line.Trim();
if (string.IsNullOrWhiteSpace(trimmed)) continue;
// Check if line is a section
if (trimmed.StartsWith("[") && trimmed.EndsWith("]"))
{
section = trimmed;
continue;
}
// Split line into key and value
var parts = trimmed.Split(new[] { '=' }, 2);
if (parts.Length != 2) continue;
var key = parts[0].Trim();
var value = parts[1].Trim();
if (section == "[FEATURES]")
{
states[key] = value.ToLower() == "true";
}
else if (section == "[APP]")
{
if (int.TryParse(value, out int size))
{
if (key.Equals("Width", StringComparison.OrdinalIgnoreCase))
form.Width = size;
else if (key.Equals("Height", StringComparison.OrdinalIgnoreCase))
form.Height = size;
}
}
}
// Apply saved feature states to tree nodes
ApplyStates(tree.Nodes, states);
}
// Applies the saved states to the TreeView nodes
private static void ApplyStates(TreeNodeCollection nodes, Dictionary<string, bool> states)
{
foreach (TreeNode node in nodes)
{
string nodeName = node.Text.Trim();
if (states.ContainsKey(nodeName))
node.Checked = states[nodeName];
if (node.Nodes.Count > 0)
ApplyStates(node.Nodes, states);
}
}
// Saves individual settings (like checkbox states) for a specific view
public static void SaveViewSettings(string viewName, Dictionary<string, bool> settings)
{
lock (FileLock)
{
var lines = File.Exists(IniPath) ? File.ReadAllLines(IniPath).ToList() : new List<string>();
// Remove previous section to avoid duplicates
RemoveSection(lines, viewName);
// Append new section with updated settings
lines.Add($"[{viewName}]");
foreach (var kvp in settings)
{
lines.Add($"{kvp.Key}={kvp.Value}");
}
File.WriteAllLines(IniPath, lines);
}
}
// Loads individual settings for a specific view (e.g. checkboxes)
public static Dictionary<string, bool> LoadViewSettings(string viewName)
{
var result = new Dictionary<string, bool>();
if (!File.Exists(IniPath)) return result;
var lines = File.ReadAllLines(IniPath);
bool inTargetSection = false;
foreach (var line in lines)
{
var trimmed = line.Trim();
if (string.IsNullOrWhiteSpace(trimmed)) continue;
// Check if we are in the desired view section
if (trimmed.StartsWith("[") && trimmed.EndsWith("]"))
{
inTargetSection = trimmed.Equals($"[{viewName}]", StringComparison.OrdinalIgnoreCase);
continue;
}
if (!inTargetSection) continue;
var parts = trimmed.Split(new[] { '=' }, 2);
if (parts.Length != 2) continue;
var key = parts[0].Trim();
var value = parts[1].Trim();
result[key] = value.ToLower() == "true";
}
return result;
}
// Checks if a setting exists in a specific section
public static bool IsViewSettingEnabled(string sectionName, string settingName)
{
var settings = LoadViewSettings(sectionName);
return settings.ContainsKey(settingName) && settings[settingName];
}
}
/// <summary>
/// Extension methods for IDictionary to provide default value retrieval.
/// </summary>
public static class DictionaryExtensions
{
public static TValue GetValueOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> dict, TKey key, TValue defaultValue = default)
{
return dict.TryGetValue(key, out var value) ? value : defaultValue;
}
}
+39 -12
View File
@@ -1,4 +1,4 @@
namespace Crapfixer
namespace CrapFixer
{
partial class MainForm
{
@@ -29,6 +29,7 @@
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
this.panelContainer = new System.Windows.Forms.Panel();
this.panelContent = new System.Windows.Forms.Panel();
this.btnAnalyze = new System.Windows.Forms.Button();
@@ -37,6 +38,7 @@
this.treeFeatures = new System.Windows.Forms.TreeView();
this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
this.analyzeMarkedFeatureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.previewMarkedFeatureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.fixMarkedFeatureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.seperatorToolStripMenuItem = new System.Windows.Forms.ToolStripSeparator();
this.restoreMarkedFeatureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@@ -44,6 +46,7 @@
this.Apps = new System.Windows.Forms.TabPage();
this.checkedListBoxApps = new System.Windows.Forms.CheckedListBox();
this.groupBox = new System.Windows.Forms.GroupBox();
this.comboLogActions = new System.Windows.Forms.ComboBox();
this.rtbLogger = new System.Windows.Forms.RichTextBox();
this.btnFix = new System.Windows.Forms.Button();
this.panelHeader = new System.Windows.Forms.Panel();
@@ -159,13 +162,14 @@
//
this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.analyzeMarkedFeatureToolStripMenuItem,
this.previewMarkedFeatureToolStripMenuItem,
this.fixMarkedFeatureToolStripMenuItem,
this.seperatorToolStripMenuItem,
this.restoreMarkedFeatureToolStripMenuItem,
this.helpMarkedFeatureToolStripMenuItem});
this.contextMenuStrip.Name = "contextManualMenu";
this.contextMenuStrip.RenderMode = System.Windows.Forms.ToolStripRenderMode.System;
this.contextMenuStrip.Size = new System.Drawing.Size(119, 98);
this.contextMenuStrip.Size = new System.Drawing.Size(119, 120);
//
// analyzeMarkedFeatureToolStripMenuItem
//
@@ -174,6 +178,13 @@
this.analyzeMarkedFeatureToolStripMenuItem.Text = "Analyze";
this.analyzeMarkedFeatureToolStripMenuItem.Click += new System.EventHandler(this.analyzeMarkedFeatureToolStripMenuItem_Click);
//
// previewMarkedFeatureToolStripMenuItem
//
this.previewMarkedFeatureToolStripMenuItem.Name = "previewMarkedFeatureToolStripMenuItem";
this.previewMarkedFeatureToolStripMenuItem.Size = new System.Drawing.Size(118, 22);
this.previewMarkedFeatureToolStripMenuItem.Text = "Preview";
this.previewMarkedFeatureToolStripMenuItem.Click += new System.EventHandler(this.previewMarkedFeatureToolStripMenuItem_Click);
//
// fixMarkedFeatureToolStripMenuItem
//
this.fixMarkedFeatureToolStripMenuItem.Name = "fixMarkedFeatureToolStripMenuItem";
@@ -234,6 +245,7 @@
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.groupBox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(252)))), ((int)(((byte)(252)))), ((int)(((byte)(252)))));
this.groupBox.Controls.Add(this.comboLogActions);
this.groupBox.Controls.Add(this.rtbLogger);
this.groupBox.Location = new System.Drawing.Point(280, 21);
this.groupBox.Name = "groupBox";
@@ -241,6 +253,20 @@
this.groupBox.TabIndex = 200;
this.groupBox.TabStop = false;
//
// comboLogActions
//
this.comboLogActions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.comboLogActions.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboLogActions.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.comboLogActions.Font = new System.Drawing.Font("Tahoma", 8.25F);
this.comboLogActions.FormattingEnabled = true;
this.comboLogActions.Location = new System.Drawing.Point(7, 292);
this.comboLogActions.Name = "comboLogActions";
this.comboLogActions.Size = new System.Drawing.Size(305, 21);
this.comboLogActions.TabIndex = 210;
this.comboLogActions.Visible = false;
//
// rtbLogger
//
this.rtbLogger.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
@@ -252,7 +278,7 @@
this.rtbLogger.Location = new System.Drawing.Point(7, 12);
this.rtbLogger.Name = "rtbLogger";
this.rtbLogger.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;
this.rtbLogger.Size = new System.Drawing.Size(305, 297);
this.rtbLogger.Size = new System.Drawing.Size(305, 273);
this.rtbLogger.TabIndex = 195;
this.rtbLogger.Text = "";
//
@@ -266,7 +292,7 @@
this.btnFix.Name = "btnFix";
this.btnFix.Size = new System.Drawing.Size(121, 29);
this.btnFix.TabIndex = 2;
this.btnFix.Text = "Run &CFixer";
this.btnFix.Text = "Run &Fixer";
this.btnFix.UseVisualStyleBackColor = false;
this.btnFix.Click += new System.EventHandler(this.btnFix_Click);
//
@@ -300,7 +326,7 @@
this.lblVersionInfo.AutoSize = true;
this.lblVersionInfo.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.5F);
this.lblVersionInfo.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(230)))), ((int)(((byte)(230)))));
this.lblVersionInfo.Location = new System.Drawing.Point(195, 15);
this.lblVersionInfo.Location = new System.Drawing.Point(198, 15);
this.lblVersionInfo.Name = "lblVersionInfo";
this.lblVersionInfo.Size = new System.Drawing.Size(13, 13);
this.lblVersionInfo.TabIndex = 2;
@@ -309,18 +335,18 @@
// lblHeader
//
this.lblHeader.AutoEllipsis = true;
this.lblHeader.Font = new System.Drawing.Font("Tahoma", 15F, System.Drawing.FontStyle.Bold);
this.lblHeader.Font = new System.Drawing.Font("Tahoma", 14F, System.Drawing.FontStyle.Bold);
this.lblHeader.ForeColor = System.Drawing.Color.White;
this.lblHeader.Location = new System.Drawing.Point(89, 9);
this.lblHeader.Name = "lblHeader";
this.lblHeader.Size = new System.Drawing.Size(105, 25);
this.lblHeader.Size = new System.Drawing.Size(117, 25);
this.lblHeader.TabIndex = 1;
this.lblHeader.Text = "Crapfixer";
this.lblHeader.Text = "CrapFixer";
this.lblHeader.UseCompatibleTextRendering = true;
//
// pictureHeader
//
this.pictureHeader.Image = global::MSCFixer.Properties.Resources.AppIcon32;
this.pictureHeader.Image = ((System.Drawing.Image)(resources.GetObject("pictureHeader.Image")));
this.pictureHeader.Location = new System.Drawing.Point(30, 9);
this.pictureHeader.Name = "pictureHeader";
this.pictureHeader.Size = new System.Drawing.Size(44, 41);
@@ -359,8 +385,7 @@
this.linkUpdateCheck.TabIndex = 203;
this.linkUpdateCheck.TabStop = true;
this.linkUpdateCheck.Text = "Check for updates";
this.linkUpdateCheck.TextAlign = System.Drawing.ContentAlignment.TopCenter;
this.linkUpdateCheck.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkUpdateCheck_LinkClicked);
this.linkUpdateCheck.TextAlign = System.Drawing.ContentAlignment.TopCenter;
//
// btnSettings
//
@@ -429,7 +454,7 @@
this.ShowIcon = false;
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Crapfixer";
this.Text = "CrapFixer";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
this.Shown += new System.EventHandler(this.MainForm_Shown);
this.panelContainer.ResumeLayout(false);
@@ -475,6 +500,8 @@
private System.Windows.Forms.Button btnSettings;
private System.Windows.Forms.Button btnHome;
private System.Windows.Forms.LinkLabel linkSelection;
private System.Windows.Forms.ToolStripMenuItem previewMarkedFeatureToolStripMenuItem;
private System.Windows.Forms.ComboBox comboLogActions;
}
}
+69 -51
View File
@@ -1,34 +1,42 @@
using MSCFixer;
using MSCFixer.Properties;
using MSCFixer.Views;
using CFixer;
using CFixer.Properties;
using CFixer.Views;
using System;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using Views;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace Crapfixer
namespace CrapFixer
{
public partial class MainForm : Form
{
private readonly string iniPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Crapfixer.ini");
private NavigationManager navigationManager;
private NavigationHandler navigationHandler;
private readonly AppManagerService appManager = new AppManagerService();
private NavigationManager _navigationManager;
private NavigationHandler _navigationHandler;
private LogActions _logActions;
private LogActionsController _logActionsController;
private readonly AppManagerService _appManager = new AppManagerService();
public MainForm()
{
InitializeComponent();
navigationManager = new NavigationManager(panelContainer);
// Set up the main navigation manager and logger
_navigationManager = new NavigationManager(panelContainer);
Logger.OutputBox = rtbLogger;
// Set up log actions controller
_logActions = new LogActions(rtbLogger);
_logActionsController = new LogActionsController(comboLogActions, _logActions);
// Load features and plugins, and restore INI state if enabled
FeatureNodeManager.LoadFeatures(treeFeatures);
PluginManager.LoadPlugins(treeFeatures);
IniStateManager.Load(treeFeatures, iniPath);
if (IniStateManager.IsViewSettingEnabled("SETTINGS", "checkSaveToINI"))
{
IniStateManager.Load(treeFeatures, this);
}
}
private void MainForm_Shown(object sender, EventArgs e)
@@ -38,34 +46,34 @@ namespace Crapfixer
private void InitializeUI()
{
navigationHandler = new NavigationHandler(btnHome, btnSettings);
btnHome.Click += (s, e) =>
// Set the default active button
_navigationHandler = new NavigationHandler(btnHome, btnSettings);
_navigationHandler.NavigationButtonClicked += button =>
{
navigationManager.GoToMain();
navigationHandler.SetActive(btnHome);
if (button == btnHome)
{
_navigationManager.GoToMain();
}
else if (button == btnSettings)
{
_navigationManager.SwitchView(new OptionsView());
}
};
btnSettings.Click += (s, e) =>
// Set up link label for update check
linkUpdateCheck.LinkClicked += (_, __) =>
Process.Start($"https://builtbybel.github.io/CrapFixer/update-check.html?version={Program.GetAppVersion()}");
// Set up log actions controller
_logActionsController = new LogActionsController(comboLogActions, _logActions);
// Set up version labels
async Task SetVersionLabels()
{
navigationManager.SwitchView(new OptionsView(navigationManager));
navigationHandler.SetActive(btnSettings);
};
linkUpdateCheck.Click += (s, e) =>
{
Process.Start("https://github.com/builtbybel/Crapfixer/issues");
};
UpdateTitleWithOSVersion(); // Update OS version label
this.lblVersionInfo.Text = $"v{Program.GetAppVersion()} "; // Update version label
}
private async void UpdateTitleWithOSVersion()
{
string osVersion = await OSHelper.OSHelper.GetWindowsVersion();
this.lblOSInfo.Text = osVersion;
lblVersionInfo.Text = $"v{Program.GetAppVersion()} ";
lblOSInfo.Text = await OSHelper.OSHelper.GetWindowsVersion();
}
_ = SetVersionLabels();
}
private async void btnAnalyze_Click(object sender, EventArgs e)
@@ -83,6 +91,9 @@ namespace Crapfixer
// Analyze apps
await AnalyzeApps();
// Show log actions combo box
comboLogActions.Visible = true;
}
/// <summary>
@@ -94,7 +105,7 @@ namespace Crapfixer
checkedListBoxApps.Items.Clear();
// Try loading external bloatware list from file
string[] predefined = appManager.LoadExternalBloatwareList();
string[] predefined = _appManager.LoadExternalBloatwareList();
if (predefined.Length == 0)
{
@@ -111,7 +122,7 @@ namespace Crapfixer
}
// Analyze installed apps against the predefined list
var apps = await appManager.AnalyzeAndLogAppsAsync(predefined);
var apps = await _appManager.AnalyzeAndLogAppsAsync(predefined);
foreach (var app in apps)
{
@@ -183,6 +194,21 @@ namespace Crapfixer
}
}
private async void previewMarkedFeatureToolStripMenuItem_Click(object sender, EventArgs e)
{
if (treeFeatures.SelectedNode is TreeNode selectedNode)
{
if (PluginManager.IsPluginNode(selectedNode))
{
await PluginManager.AnalyzePlugin(selectedNode);
}
else
{
FeatureNodeManager.PreviewChanges(selectedNode);
}
}
}
private async void fixMarkedFeatureToolStripMenuItem_Click(object sender, EventArgs e)
{
if (treeFeatures.SelectedNode is TreeNode selectedNode)
@@ -312,18 +338,10 @@ namespace Crapfixer
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
IniStateManager.Save(treeFeatures, iniPath);
}
private void linkUpdateCheck_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
string version = Program.GetAppVersion();
string url = $"https://builtbybel.github.io/Crapfixer/update-check.html?version={version}";
Process.Start(new ProcessStartInfo
if (IniStateManager.IsViewSettingEnabled("SETTINGS", "checkSaveToINI"))
{
FileName = url,
UseShellExecute = true
});
IniStateManager.Save(treeFeatures, this);
}
}
}
}
+458
View File
@@ -0,0 +1,458 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="contextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>23, 15</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="pictureHeader.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
AABJRU5ErkJggg==
</value>
</data>
</root>
@@ -1,8 +1,9 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace MSCFixer
namespace CFixer
{
/// <summary>
/// Handles navigation button highlighting for a set of UI buttons.
@@ -21,6 +22,11 @@ namespace MSCFixer
// Border color for inactive buttons
private readonly Color _inactiveBorderColor = Color.FromArgb(114, 114, 114);
/// <summary>
/// Event fired when a navigation button is clicked.
/// </summary>
public event Action<Button> NavigationButtonClicked;
/// <summary>
/// Initializes the handler with the buttons that should be managed.
/// </summary>
@@ -28,8 +34,21 @@ namespace MSCFixer
public NavigationHandler(params Button[] buttons)
{
_buttons = new List<Button>(buttons);
foreach (var button in _buttons)
{
button.Click += OnButtonClick;
}
}
private void OnButtonClick(object sender, EventArgs e)
{
if (sender is Button clickedButton)
{
SetActive(clickedButton);
NavigationButtonClicked?.Invoke(clickedButton);
}
}
/// <summary>
/// Sets the specified button as active, changing colors accordingly.
/// </summary>
@@ -57,7 +57,7 @@ public static class PluginManager
if (!Directory.Exists(pluginsFolder))
{
Directory.CreateDirectory(pluginsFolder);
// Logger.Log("No Plugins found.\nGet it on https://github.com/builtbybel/Crapfixer");
// Logger.Log("No Plugins found.\nGet it on https://github.com/builtbybel/CrapFixer");
return;
}
+1 -4
View File
@@ -1,11 +1,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Crapfixer
namespace CrapFixer
{
internal static class Program
{
@@ -5,11 +5,11 @@ using System.Runtime.InteropServices;
// Allgemeine Informationen über eine Assembly werden über die folgenden
// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
// die einer Assembly zugeordnet sind.
[assembly: AssemblyTitle("Crapfixer")]
[assembly: AssemblyDescription("Crapfixer for Windows 11")]
[assembly: AssemblyTitle("CrapFixer")]
[assembly: AssemblyDescription("CrapFixer for Windows 11")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("A Belim app creation 2025")]
[assembly: AssemblyProduct("Crapfixer")]
[assembly: AssemblyProduct("CrapFixer")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("Builtbybel")]
[assembly: AssemblyCulture("")]
@@ -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.55.160")]
[assembly: AssemblyFileVersion("0.55.160")]
[assembly: AssemblyVersion("1.2.252")]
[assembly: AssemblyFileVersion("1.2.252")]
@@ -8,7 +8,7 @@
// </auto-generated>
//------------------------------------------------------------------------------
namespace MSCFixer.Properties {
namespace CFixer.Properties {
using System;
@@ -39,7 +39,7 @@ namespace MSCFixer.Properties {
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MSCFixer.Properties.Resources", typeof(Resources).Assembly);
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("CFixer.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
@@ -8,11 +8,11 @@
// </auto-generated>
//------------------------------------------------------------------------------
namespace MSCFixer.Properties {
namespace CFixer.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.13.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.14.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
@@ -35,6 +35,7 @@
this.linkGitHub = new System.Windows.Forms.LinkLabel();
this.btnDonate = new System.Windows.Forms.Button();
this.panelSettings = new System.Windows.Forms.Panel();
this.lblCopyright = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.panelSettings.SuspendLayout();
this.SuspendLayout();
@@ -47,9 +48,9 @@
this.lblHeader.ForeColor = System.Drawing.Color.Black;
this.lblHeader.Location = new System.Drawing.Point(61, 19);
this.lblHeader.Name = "lblHeader";
this.lblHeader.Size = new System.Drawing.Size(69, 21);
this.lblHeader.Size = new System.Drawing.Size(71, 21);
this.lblHeader.TabIndex = 235;
this.lblHeader.Text = "Crapfixer";
this.lblHeader.Text = "CrapFixer";
this.lblHeader.UseCompatibleTextRendering = true;
//
// label1
@@ -57,7 +58,7 @@
this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.label1.AutoEllipsis = true;
this.label1.Location = new System.Drawing.Point(18, 121);
this.label1.Location = new System.Drawing.Point(19, 138);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(589, 26);
this.label1.TabIndex = 236;
@@ -66,7 +67,7 @@
//
// pictureBox1
//
this.pictureBox1.Image = global::MSCFixer.Properties.Resources.AppIcon32;
this.pictureBox1.Image = global::CFixer.Properties.Resources.AppIcon32;
this.pictureBox1.Location = new System.Drawing.Point(18, 19);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(37, 34);
@@ -76,7 +77,7 @@
// lblVersionInfo
//
this.lblVersionInfo.AutoSize = true;
this.lblVersionInfo.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.5F);
this.lblVersionInfo.Font = new System.Drawing.Font("Microsoft Sans Serif", 8F);
this.lblVersionInfo.ForeColor = System.Drawing.Color.Black;
this.lblVersionInfo.Location = new System.Drawing.Point(61, 40);
this.lblVersionInfo.Name = "lblVersionInfo";
@@ -87,12 +88,12 @@
// linkGitHub
//
this.linkGitHub.AutoSize = true;
this.linkGitHub.Location = new System.Drawing.Point(37, 156);
this.linkGitHub.Location = new System.Drawing.Point(38, 173);
this.linkGitHub.Name = "linkGitHub";
this.linkGitHub.Size = new System.Drawing.Size(190, 13);
this.linkGitHub.Size = new System.Drawing.Size(193, 13);
this.linkGitHub.TabIndex = 239;
this.linkGitHub.TabStop = true;
this.linkGitHub.Text = "https://github.com/builtbybel/Crapfixer";
this.linkGitHub.Text = "https://github.com/builtbybel/CrapFixer";
this.linkGitHub.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkGitHub_LinkClicked);
//
// btnDonate
@@ -103,16 +104,17 @@
this.btnDonate.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnDonate.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.btnDonate.ForeColor = System.Drawing.Color.White;
this.btnDonate.Location = new System.Drawing.Point(60, 68);
this.btnDonate.Location = new System.Drawing.Point(61, 85);
this.btnDonate.Name = "btnDonate";
this.btnDonate.Size = new System.Drawing.Size(207, 39);
this.btnDonate.TabIndex = 240;
this.btnDonate.Text = "Like Crapfixer? Support future updates on Ko-fi or PayPal";
this.btnDonate.Text = "Like CrapFixer? Support future updates on Ko-fi or PayPal";
this.btnDonate.UseVisualStyleBackColor = false;
this.btnDonate.Click += new System.EventHandler(this.btnDonate_Click);
//
// panelSettings
//
this.panelSettings.Controls.Add(this.lblCopyright);
this.panelSettings.Controls.Add(this.btnDonate);
this.panelSettings.Controls.Add(this.lblHeader);
this.panelSettings.Controls.Add(this.linkGitHub);
@@ -125,6 +127,17 @@
this.panelSettings.Size = new System.Drawing.Size(625, 395);
this.panelSettings.TabIndex = 242;
//
// lblCopyright
//
this.lblCopyright.AutoSize = true;
this.lblCopyright.Font = new System.Drawing.Font("Microsoft Sans Serif", 8F);
this.lblCopyright.ForeColor = System.Drawing.Color.Black;
this.lblCopyright.Location = new System.Drawing.Point(61, 58);
this.lblCopyright.Name = "lblCopyright";
this.lblCopyright.Size = new System.Drawing.Size(193, 13);
this.lblCopyright.TabIndex = 241;
this.lblCopyright.Text = "Copyright (c) 2025 A Belim app creation";
//
// AboutView
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
@@ -149,5 +162,6 @@
private System.Windows.Forms.LinkLabel linkGitHub;
private System.Windows.Forms.Button btnDonate;
private System.Windows.Forms.Panel panelSettings;
private System.Windows.Forms.Label lblCopyright;
}
}
@@ -1,5 +1,5 @@
using Crapfixer;
using MSCFixer.Views;
using CrapFixer;
using CFixer.Views;
using System;
using System.Diagnostics;
using System.Windows.Forms;
@@ -9,7 +9,6 @@ namespace Views
public partial class AboutView : UserControl
{
public AboutView()
{
InitializeComponent();
@@ -24,14 +23,14 @@ namespace Views
private void linkGitHub_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
Process.Start("https://github.com/builtbybel/Crapfixer/releases");
Process.Start("https://github.com/builtbybel/CrapFixer/releases");
}
private void btnDonate_Click(object sender, EventArgs e)
{
var result = MessageBox.Show(
"Hi! I'm building Crapfixer solo. Want to support me and help launch Version 1.0?",
"Support Crapfixer ❤️",
"Hi! I'm building CrapFixer solo. Want to support me and help launch Version 1.0?",
"Support CrapFixer ❤️",
MessageBoxButtons.YesNo,
MessageBoxIcon.Information);
@@ -61,7 +60,5 @@ namespace Views
}
}
}
}
}
@@ -1,4 +1,4 @@
namespace MSCFixer.Views
namespace CFixer.Views
{
partial class OptionsView
{
@@ -32,12 +32,14 @@
this.panelSubContent = new System.Windows.Forms.Panel();
this.btnAboutMenu = new System.Windows.Forms.Button();
this.btnSettingsMenu = new System.Windows.Forms.Button();
this.btnPluginsMenu = new System.Windows.Forms.Button();
this.panelSettings.SuspendLayout();
this.SuspendLayout();
//
// panelSettings
//
this.panelSettings.BackColor = System.Drawing.Color.White;
this.panelSettings.Controls.Add(this.btnPluginsMenu);
this.panelSettings.Controls.Add(this.panelSubContent);
this.panelSettings.Controls.Add(this.btnAboutMenu);
this.panelSettings.Controls.Add(this.btnSettingsMenu);
@@ -60,11 +62,12 @@
//
// btnAboutMenu
//
this.btnAboutMenu.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.btnAboutMenu.BackColor = System.Drawing.Color.White;
this.btnAboutMenu.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(153)))), ((int)(((byte)(180)))), ((int)(((byte)(209)))));
this.btnAboutMenu.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnAboutMenu.Font = new System.Drawing.Font("Tahoma", 8F);
this.btnAboutMenu.Location = new System.Drawing.Point(14, 53);
this.btnAboutMenu.Location = new System.Drawing.Point(14, 343);
this.btnAboutMenu.Name = "btnAboutMenu";
this.btnAboutMenu.Size = new System.Drawing.Size(107, 34);
this.btnAboutMenu.TabIndex = 242;
@@ -86,6 +89,20 @@
this.btnSettingsMenu.UseVisualStyleBackColor = false;
this.btnSettingsMenu.Click += new System.EventHandler(this.btnSettingsMenu_Click);
//
// btnPluginsMenu
//
this.btnPluginsMenu.BackColor = System.Drawing.Color.White;
this.btnPluginsMenu.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(153)))), ((int)(((byte)(180)))), ((int)(((byte)(209)))));
this.btnPluginsMenu.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnPluginsMenu.Font = new System.Drawing.Font("Tahoma", 8F);
this.btnPluginsMenu.Location = new System.Drawing.Point(14, 53);
this.btnPluginsMenu.Name = "btnPluginsMenu";
this.btnPluginsMenu.Size = new System.Drawing.Size(107, 34);
this.btnPluginsMenu.TabIndex = 247;
this.btnPluginsMenu.Text = "Plugins";
this.btnPluginsMenu.UseVisualStyleBackColor = false;
this.btnPluginsMenu.Click += new System.EventHandler(this.btnPluginsMenu_Click);
//
// OptionsView
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -104,5 +121,6 @@
private System.Windows.Forms.Button btnSettingsMenu;
private System.Windows.Forms.Button btnAboutMenu;
private System.Windows.Forms.Panel panelSubContent;
private System.Windows.Forms.Button btnPluginsMenu;
}
}
@@ -2,13 +2,13 @@
using System.Windows.Forms;
using Views;
namespace MSCFixer.Views
namespace CFixer.Views
{
public partial class OptionsView : UserControl
{
private NavigationManager subNavigation;
public OptionsView(NavigationManager navigationManager)
public OptionsView()
{
InitializeComponent();
subNavigation = new NavigationManager(panelSubContent);
@@ -24,5 +24,10 @@ namespace MSCFixer.Views
{
subNavigation.SwitchView(new SettingsView());
}
private void btnPluginsMenu_Click(object sender, EventArgs e)
{
subNavigation.SwitchView(new PluginsView());
}
}
}
+168
View File
@@ -0,0 +1,168 @@
namespace CFixer.Views
{
partial class PluginsView
{
/// <summary>
/// Erforderliche Designervariable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Verwendete Ressourcen bereinigen.
/// </summary>
/// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Vom Komponenten-Designer generierter Code
/// <summary>
/// Erforderliche Methode für die Designerunterstützung.
/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
/// </summary>
private void InitializeComponent()
{
this.btnPluginInstall = new System.Windows.Forms.Button();
this.btnDescription = new System.Windows.Forms.Button();
this.listBoxPlugins = new System.Windows.Forms.CheckedListBox();
this.progressBarDownload = new System.Windows.Forms.ProgressBar();
this.btnPluginOpen = new System.Windows.Forms.Button();
this.btnPluginRemove = new System.Windows.Forms.Button();
this.btnPluginSubmit = new System.Windows.Forms.Button();
this.btnPluginUpdateAll = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// btnPluginInstall
//
this.btnPluginInstall.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnPluginInstall.Location = new System.Drawing.Point(488, 46);
this.btnPluginInstall.Name = "btnPluginInstall";
this.btnPluginInstall.Size = new System.Drawing.Size(121, 29);
this.btnPluginInstall.TabIndex = 7;
this.btnPluginInstall.Text = "Install";
this.btnPluginInstall.UseVisualStyleBackColor = true;
this.btnPluginInstall.Click += new System.EventHandler(this.btnPluginInstall_Click);
//
// btnDescription
//
this.btnDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.btnDescription.AutoEllipsis = true;
this.btnDescription.BackColor = System.Drawing.Color.WhiteSmoke;
this.btnDescription.FlatAppearance.BorderColor = System.Drawing.Color.Gainsboro;
this.btnDescription.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnDescription.Location = new System.Drawing.Point(15, 10);
this.btnDescription.Name = "btnDescription";
this.btnDescription.Padding = new System.Windows.Forms.Padding(20, 0, 0, 0);
this.btnDescription.Size = new System.Drawing.Size(594, 25);
this.btnDescription.TabIndex = 6;
this.btnDescription.Text = "Plugins Gallery (App restart needed after install)";
this.btnDescription.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.btnDescription.UseVisualStyleBackColor = true;
//
// listBoxPlugins
//
this.listBoxPlugins.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.listBoxPlugins.Font = new System.Drawing.Font("Tahoma", 8.25F);
this.listBoxPlugins.FormattingEnabled = true;
this.listBoxPlugins.Location = new System.Drawing.Point(15, 44);
this.listBoxPlugins.Name = "listBoxPlugins";
this.listBoxPlugins.Size = new System.Drawing.Size(457, 340);
this.listBoxPlugins.TabIndex = 8;
this.listBoxPlugins.SelectedIndexChanged += new System.EventHandler(this.listBoxPlugins_SelectedIndexChanged);
//
// progressBarDownload
//
this.progressBarDownload.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.progressBarDownload.Location = new System.Drawing.Point(15, 380);
this.progressBarDownload.Name = "progressBarDownload";
this.progressBarDownload.Size = new System.Drawing.Size(457, 12);
this.progressBarDownload.TabIndex = 9;
this.progressBarDownload.Visible = false;
//
// btnPluginOpen
//
this.btnPluginOpen.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnPluginOpen.Location = new System.Drawing.Point(488, 116);
this.btnPluginOpen.Name = "btnPluginOpen";
this.btnPluginOpen.Size = new System.Drawing.Size(121, 29);
this.btnPluginOpen.TabIndex = 10;
this.btnPluginOpen.Text = "Open";
this.btnPluginOpen.UseVisualStyleBackColor = true;
this.btnPluginOpen.Click += new System.EventHandler(this.btnPluginOpen_Click);
//
// btnPluginRemove
//
this.btnPluginRemove.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnPluginRemove.Location = new System.Drawing.Point(488, 151);
this.btnPluginRemove.Name = "btnPluginRemove";
this.btnPluginRemove.Size = new System.Drawing.Size(121, 29);
this.btnPluginRemove.TabIndex = 11;
this.btnPluginRemove.Text = "Remove";
this.btnPluginRemove.UseVisualStyleBackColor = true;
this.btnPluginRemove.Click += new System.EventHandler(this.btnPluginRemove_Click);
//
// btnPluginSubmit
//
this.btnPluginSubmit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnPluginSubmit.Location = new System.Drawing.Point(488, 345);
this.btnPluginSubmit.Name = "btnPluginSubmit";
this.btnPluginSubmit.Size = new System.Drawing.Size(121, 29);
this.btnPluginSubmit.TabIndex = 12;
this.btnPluginSubmit.Text = "Submit Plugin";
this.btnPluginSubmit.UseVisualStyleBackColor = true;
this.btnPluginSubmit.Click += new System.EventHandler(this.btnPluginSubmit_Click);
//
// btnPluginUpdateAll
//
this.btnPluginUpdateAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnPluginUpdateAll.Location = new System.Drawing.Point(488, 81);
this.btnPluginUpdateAll.Name = "btnPluginUpdateAll";
this.btnPluginUpdateAll.Size = new System.Drawing.Size(121, 29);
this.btnPluginUpdateAll.TabIndex = 13;
this.btnPluginUpdateAll.Text = "Update All";
this.btnPluginUpdateAll.UseVisualStyleBackColor = true;
this.btnPluginUpdateAll.Click += new System.EventHandler(this.btnPluginUpdateAll_Click);
//
// PluginsView
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.AutoScroll = true;
this.BackColor = System.Drawing.Color.White;
this.Controls.Add(this.btnPluginUpdateAll);
this.Controls.Add(this.btnPluginSubmit);
this.Controls.Add(this.btnPluginRemove);
this.Controls.Add(this.btnPluginOpen);
this.Controls.Add(this.progressBarDownload);
this.Controls.Add(this.listBoxPlugins);
this.Controls.Add(this.btnPluginInstall);
this.Controls.Add(this.btnDescription);
this.Name = "PluginsView";
this.Size = new System.Drawing.Size(625, 395);
this.Load += new System.EventHandler(this.PluginsView_Load);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Button btnPluginInstall;
private System.Windows.Forms.Button btnDescription;
private System.Windows.Forms.CheckedListBox listBoxPlugins;
private System.Windows.Forms.ProgressBar progressBarDownload;
private System.Windows.Forms.Button btnPluginOpen;
private System.Windows.Forms.Button btnPluginRemove;
private System.Windows.Forms.Button btnPluginSubmit;
private System.Windows.Forms.Button btnPluginUpdateAll;
}
}
+243
View File
@@ -0,0 +1,243 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CFixer.Views
{
public partial class PluginsView : UserControl
{
private List<PluginEntry> plugins = new List<PluginEntry>();
private HashSet<string> installedPlugins = new HashSet<string>();
private const string manifestUrl = "https://raw.githubusercontent.com/builtbybel/CrapFixer/main/plugins/plugins_manifest.txt";
public class PluginEntry
{
public string Name { get; set; }
public string Description { get; set; }
public string Url { get; set; }
}
public PluginsView()
{
InitializeComponent();
}
private async void PluginsView_Load(object sender, EventArgs e)
{
await LoadPlugins();
}
private void LoadInstalledPlugins()
{
var pluginPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "plugins");
if (Directory.Exists(pluginPath))
{
foreach (var file in Directory.GetFiles(pluginPath))
{
installedPlugins.Add(Path.GetFileName(file));
}
}
}
private async Task LoadPlugins()
{
try
{
LoadInstalledPlugins();
using (var client = new WebClient())
{
string content = await Task.Run(() => client.DownloadString(manifestUrl));
plugins = ParseManifest(content);
listBoxPlugins.Items.Clear();
foreach (var plugin in plugins)
{
var fileName = Path.GetFileName(plugin.Url);
string displayName = plugin.Name;
if (installedPlugins.Contains(fileName))
displayName += " (Installed)";
listBoxPlugins.Items.Add(displayName);
}
}
}
catch (Exception ex)
{
MessageBox.Show("Error loading plugins: " + ex.Message);
}
}
private List<PluginEntry> ParseManifest(string content)
{
var result = new List<PluginEntry>();
var lines = content.Split(new[] { "\r\n", "\n" }, StringSplitOptions.None);
PluginEntry current = null;
foreach (var line in lines)
{
if (line.StartsWith("[") && line.EndsWith("]"))
{
if (current != null)
result.Add(current);
var name = line.Substring(1, line.Length - 2).Trim();
current = new PluginEntry { Name = name };
}
else if (!string.IsNullOrWhiteSpace(line) && line.Contains("=") && current != null)
{
var parts = line.Split(new[] { '=' }, 2);
var key = parts[0].Trim();
var value = parts[1].Trim();
switch (key)
{
case "description":
current.Description = value;
break;
case "url":
current.Url = value;
break;
}
}
}
if (current != null)
result.Add(current);
return result;
}
private async Task InstallPlugins(bool force = false)
{
var checkedIndices = listBoxPlugins.CheckedIndices;
if (checkedIndices.Count == 0)
{
MessageBox.Show("Please check one or more plugins to download.");
return;
}
string savePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "plugins");
Directory.CreateDirectory(savePath);
progressBarDownload.Visible = true;
progressBarDownload.Value = 0;
progressBarDownload.Maximum = checkedIndices.Count;
int done = 0;
using (var client = new WebClient())
{
foreach (int index in checkedIndices)
{
var plugin = plugins[index];
string file = Path.Combine(savePath, Path.GetFileName(plugin.Url));
if (!force && File.Exists(file)) // skip only if not in force‑mode
{
progressBarDownload.Value = ++done;
continue;
}
try
{
await client.DownloadFileTaskAsync(new Uri(plugin.Url), file);
installedPlugins.Add(Path.GetFileName(plugin.Url));
listBoxPlugins.Items[index] = plugin.Name + " (Installed)";
}
catch (Exception ex)
{
MessageBox.Show($"Failed to download {plugin.Name}: {ex.Message}");
}
progressBarDownload.Value = ++done;
}
}
progressBarDownload.Visible = false;
}
private async void btnPluginInstall_Click(object sender, EventArgs e)
{
await InstallPlugins(force: false); // skip installed
}
private async void btnPluginUpdateAll_Click(object sender, EventArgs e)
{
// check every item
for (int i = 0; i < listBoxPlugins.Items.Count; i++)
listBoxPlugins.SetItemChecked(i, true);
await InstallPlugins(force: true); // always overwrite
MessageBox.Show("All plugins updated.");
}
private void listBoxPlugins_SelectedIndexChanged(object sender, EventArgs e)
{
int index = listBoxPlugins.SelectedIndex;
if (index >= 0 && index < plugins.Count)
{
btnDescription.Text = plugins[index].Description;
}
}
private void btnPluginOpen_Click(object sender, EventArgs e)
{
string pluginPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "plugins");
if (Directory.Exists(pluginPath))
{
System.Diagnostics.Process.Start("explorer.exe", pluginPath);
}
else
{
MessageBox.Show("The plugins folder does not exist yet.");
}
}
private void btnPluginRemove_Click(object sender, EventArgs e)
{
string pluginPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins");
var indices = listBoxPlugins.CheckedIndices.Cast<int>().ToList();
if (indices.Count == 0)
{
MessageBox.Show("No plugins selected.");
return;
}
foreach (int i in indices)
{
var plugin = plugins[i];
string path = Path.Combine(pluginPath, Path.GetFileName(plugin.Url));
if (File.Exists(path))
File.Delete(path);
listBoxPlugins.Items[i] = plugin.Name; // Remove (Installed) tag
listBoxPlugins.SetItemChecked(i, false); // Uncheck
installedPlugins.Remove(Path.GetFileName(plugin.Url));
}
MessageBox.Show("Selected plugins removed.");
}
private void btnPluginSubmit_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo
{
FileName = "https://github.com/builtbybel/CrapFixer/blob/main/plugins/plugins_manifest.txt",
UseShellExecute = true
});
}
}
}
@@ -1,4 +1,4 @@
namespace MSCFixer.Views
namespace CFixer.Views
{
partial class SettingsView
{
@@ -28,23 +28,22 @@
/// </summary>
private void InitializeComponent()
{
this.checkBox1 = new System.Windows.Forms.CheckBox();
this.checkSaveToINI = new System.Windows.Forms.CheckBox();
this.checkBox2 = new System.Windows.Forms.CheckBox();
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// checkBox1
// checkSaveToINI
//
this.checkBox1.AutoSize = true;
this.checkBox1.Checked = true;
this.checkBox1.CheckState = System.Windows.Forms.CheckState.Checked;
this.checkBox1.Enabled = false;
this.checkBox1.Location = new System.Drawing.Point(15, 44);
this.checkBox1.Name = "checkBox1";
this.checkBox1.Size = new System.Drawing.Size(135, 17);
this.checkBox1.TabIndex = 0;
this.checkBox1.Text = "Save settings to INI file";
this.checkBox1.UseVisualStyleBackColor = true;
this.checkSaveToINI.AutoSize = true;
this.checkSaveToINI.Checked = true;
this.checkSaveToINI.CheckState = System.Windows.Forms.CheckState.Checked;
this.checkSaveToINI.Location = new System.Drawing.Point(15, 44);
this.checkSaveToINI.Name = "checkSaveToINI";
this.checkSaveToINI.Size = new System.Drawing.Size(135, 17);
this.checkSaveToINI.TabIndex = 0;
this.checkSaveToINI.Text = "Save settings to INI file";
this.checkSaveToINI.UseVisualStyleBackColor = true;
//
// checkBox2
//
@@ -77,14 +76,15 @@
//
// SettingsView
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.BackColor = System.Drawing.Color.White;
this.Controls.Add(this.button1);
this.Controls.Add(this.checkBox2);
this.Controls.Add(this.checkBox1);
this.Controls.Add(this.checkSaveToINI);
this.Name = "SettingsView";
this.Size = new System.Drawing.Size(625, 395);
this.Leave += new System.EventHandler(this.SettingsView_Leave);
this.ResumeLayout(false);
this.PerformLayout();
@@ -92,7 +92,7 @@
#endregion
private System.Windows.Forms.CheckBox checkBox1;
private System.Windows.Forms.CheckBox checkSaveToINI;
private System.Windows.Forms.CheckBox checkBox2;
private System.Windows.Forms.Button button1;
}
+42
View File
@@ -0,0 +1,42 @@
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace CFixer.Views
{
public partial class SettingsView : UserControl
{
public SettingsView()
{
InitializeComponent();
LoadSettings();
}
/// <summary>
/// Collects and saves all relevant checkbox settings to the INI file.
/// </summary>
public void SaveSettings()
{
var settings = new Dictionary<string, bool>
{
{ nameof(checkSaveToINI), checkSaveToINI.Checked },
};
IniStateManager.SaveViewSettings("SETTINGS", settings);
}
/// <summary>
/// Loads checkbox settings from the INI file and applies them to the view.
/// </summary>
public void LoadSettings()
{
var settings = IniStateManager.LoadViewSettings("SETTINGS");
checkSaveToINI.Checked = settings.GetValueOrDefault(nameof(checkSaveToINI), false);
}
private void SettingsView_Leave(object sender, EventArgs e)
{
SaveSettings();
}
}
}
@@ -117,7 +117,4 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="contextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>23, 15</value>
</metadata>
</root>
-74
View File
@@ -1,74 +0,0 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using System.Threading.Tasks;
namespace Settings.AI
{
internal class RecallMachine : FeatureBase
{
private const string keyName = @"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsAI";
private const string valueName = "DisableAIDataAnalysis";
private const int recommendedValue = 0;
public override string GetFeatureDetails()
{
return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}";
}
public override string ID()
{
return "Don't Allow system-wide snapshots";
}
public override string Info()
{
return "This feature will disable system-wide snapshots.";
}
public override bool 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;
}
// Key exists, check if value is desired value
return (int)value != recommendedValue;
}
public override Task<bool> DoFeature()
{
try
{
Registry.SetValue(keyName, valueName, 1, Microsoft.Win32.RegistryValueKind.DWord);
Logger.Log("You've even disabled system-wide Snapshots for all users now.", LogLevel.Info);
return Task.FromResult(true);
}
catch (Exception ex)
{
Logger.Log("Code red in " + ex.Message, LogLevel.Error);
}
return Task.FromResult(false);
}
public override bool UndoFeature()
{
try
{
Registry.SetValue(keyName, valueName, recommendedValue, Microsoft.Win32.RegistryValueKind.DWord);
return true;
}
catch (Exception ex)
{
Logger.Log("Code red in " + ex.Message, LogLevel.Error);
}
return false;
}
}
}
-74
View File
@@ -1,74 +0,0 @@
using Microsoft.Win32;
using System;
using Crapfixer;
using System.Threading.Tasks;
namespace Settings.AI
{
internal class RecallUser : FeatureBase
{
private const string keyName = @"HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\WindowsAI";
private const string valueName = "DisableAIDataAnalysis";
private const int recommendedValue = 0;
public override string GetFeatureDetails()
{
return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}";
}
public override string ID()
{
return "Don't Allow Windows to save snapshots of your screen";
}
public override string Info()
{
return "This feature will disable Recall from saving snapshots of your screen.";
}
public override bool 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;
}
// Key exists, check if value is desired value
return (int)value != recommendedValue;
}
public override Task<bool> DoFeature()
{
try
{
Registry.SetValue(keyName, valueName, 1, Microsoft.Win32.RegistryValueKind.DWord);
Logger.Log("You've got snapshots disabled.", LogLevel.Info);
return Task.FromResult(true);
}
catch (Exception ex)
{
Logger.Log("Code red in " + ex.Message, LogLevel.Error);
}
return Task.FromResult(false);
}
public override bool UndoFeature()
{
try
{
Registry.SetValue(keyName, valueName, recommendedValue, Microsoft.Win32.RegistryValueKind.DWord);
return true;
}
catch (Exception ex)
{
Logger.Log("Code red in " + ex.Message, LogLevel.Error);
}
return false;
}
}
}
-69
View File
@@ -1,69 +0,0 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
public static class IniStateManager
{
// Saves the states of the TreeView nodes to an INI file
public static void Save(TreeView tree, string path)
{
using (var writer = new StreamWriter(path))
{
// Iterates through all nodes and saves their state
WriteNodeStates(writer, tree.Nodes);
}
}
// Loads the states of the TreeView nodes from an INI file
public static void Load(TreeView tree, string path)
{
if (!File.Exists(path)) return;
var lines = File.ReadAllLines(path);
var states = lines.Select(l => l.Split(new[] { '=' }, 2))
.Where(p => p.Length == 2)
.ToDictionary(p => p[0].Trim(), p => p[1].Trim().ToLower() == "true");
// Sets the state of the nodes based on the loaded data
ApplyStates(tree.Nodes, states);
}
/// <summary>
/// Saves the state of each node in the TreeView recursively.
/// </summary>
/// <param name="writer"></param>
/// <param name="nodes"></param>
private static void WriteNodeStates(StreamWriter writer, TreeNodeCollection nodes)
{
foreach (TreeNode node in nodes)
{
// Saves the node's name and its checked status
writer.WriteLine($"{node.Text.Trim()}={node.Checked}");
// If the node has children, recursively go through all nodes
if (node.Nodes.Count > 0)
WriteNodeStates(writer, node.Nodes);
}
}
/// <summary>
/// Applies the saved states to the TreeView nodes recursively.
/// </summary>
/// <param name="nodes"></param>
/// <param name="states"></param>
private static void ApplyStates(TreeNodeCollection nodes, Dictionary<string, bool> states)
{
foreach (TreeNode node in nodes)
{
string nodeName = node.Text.Trim();
if (states.ContainsKey(nodeName))
{
node.Checked = states[nodeName];
}
// Apply recursively to child nodes
if (node.Nodes.Count > 0)
ApplyStates(node.Nodes, states);
}
}
}
-17
View File
@@ -1,17 +0,0 @@
using Crapfixer;
using System;
using System.Diagnostics;
using System.Windows.Forms;
namespace MSCFixer.Views
{
public partial class SettingsView : UserControl
{
public SettingsView()
{
InitializeComponent();
}
}
}