34 Commits

Author SHA1 Message Date
Raphire
f47b0531a4 Update app tooltip descriptions 2026-02-17 00:11:55 +01:00
Raphire
6427b35bc8 Fix CreateRestorePoint Timeout 2026-02-15 23:50:32 +01:00
Raphire
60e8985db0 Update tooltips 2026-02-15 23:34:46 +01:00
Raphire
6589dab528 Bump release 2026-02-15 23:24:26 +01:00
Raphire
2a9a3960b8 Update menu.png image 2026-02-15 23:23:51 +01:00
Jeffrey
65aabbc050 Refactor code structure for improved readability and maintainability (#473)
* Add ToolTips to Tweaks
2026-02-15 23:08:54 +01:00
Jeffrey
95dc490b6e Add tweak category icons (#471) 2026-02-15 16:59:25 +01:00
Jeffrey
687c089f2e Prompt after failure to create restore point (#469) 2026-02-15 16:54:01 +01:00
Jeffrey
5dcc8bffdd Add titlebar menu and MessageBox styling (#470) 2026-02-15 16:53:41 +01:00
Raphire
f9b4cec417 Update README.md links to wiki 2026-02-12 23:55:47 +01:00
Jeffrey
0e7b289d03 Add Multi-tasking settings (#458)
- Disable window snapping
- Disable Snap Assist
- Disable Snap Layouts
- Change showing tabs when snapping or pressing Alt+Tab
2026-02-12 23:14:15 +01:00
Jeffrey
feef8f76b9 Add option to select target user(s) for app removal (#462) 2026-02-12 22:50:22 +01:00
Jeffrey
50db66bb5f Fix styling for other user input box (#459) 2026-02-11 22:27:50 +01:00
Raphire
b48fa24627 Improve DisableEdgeAds feature
This will now also disable:
- The first run experience
- Default browser prompts
- Adobe Acrobat buttons/ads
- Spotlight experiences and recommendations
2026-02-10 21:11:46 +01:00
Raphire
f8c2c6ddd7 Fix Header styling on Applying Changes page 2026-02-07 19:18:09 +01:00
Raphire
1ea2c63522 Add link to wiki next to tweak category headers 2026-02-07 15:42:06 +01:00
Raphire
675882cb3b Fix key in Enable_Game_Bar_Integration.reg 2026-02-07 15:06:45 +01:00
Raphire
ae4d19f59c Update Start/Apply button styling 2026-02-07 01:40:28 +01:00
Jeffrey
327f4ee7ab Allow forceful MS Edge removal via GUI, remove max version from DisableStartRecommended (#454) 2026-02-06 23:45:47 +01:00
Jeffrey
3af62159a5 UI improvements & cancel execution when closing during execution (#455) 2026-02-06 23:44:39 +01:00
Raphire
6e65a07184 Add missing switches for Windows Update settings 2026-02-04 14:01:04 +01:00
Jeffrey
84bff3ab0c Add option to disable BitLocker automatic device encryption (#451) 2026-02-04 13:59:10 +01:00
Jeffrey
46deca7703 Add Windows Update Settings (#450)
- Prevent getting updates as soon as they're available
- Prevent automatic restarts after updates while signed in
- Disable sharing downloaded updates with other PCs
2026-02-04 13:47:47 +01:00
Jeffrey
6a3f244f9b Support Ctrl+F for search boxes (#449) 2026-02-04 11:43:36 +01:00
Jeffrey
75d783cc63 Make GUI resizable (#448) 2026-02-04 11:34:55 +01:00
Jeffrey
afdb66b5d4 Fix crash on clearing Start menu pinned apps for all users (#447)
As reported in #445
2026-02-04 10:26:55 +01:00
Jeffrey
6a1a091a87 Add search bar to tweak page (#440) 2026-02-02 21:54:40 +01:00
Raphire
1ef8992320 Respect NoRestartExplorer flag in GUI 2026-02-02 21:52:09 +01:00
Jeffrey
59d0e83238 Remove sponsorship (#442) 2026-02-02 20:43:59 +01:00
makhlwf
482161fdd8 Improve UI accessibility for screen readers (#441) 2026-02-02 20:42:29 +01:00
Raphire
91f3dbf5e6 Compressed menu.png to reduce download size 2026-02-01 13:48:05 +01:00
Raphire
57f5e1c632 Remove wiki image to reduce download size 2026-02-01 13:43:02 +01:00
Raphire
95e844923e Minimize the powershell window when no parameters are provided 2026-02-01 13:40:22 +01:00
Raphire
c6e3edbe40 Minimize Win11Debloat powershell window when not running CLI mode 2026-02-01 13:37:27 +01:00
67 changed files with 4319 additions and 2274 deletions

1
.gitignore vendored
View File

@@ -2,4 +2,5 @@ LastSettings
SavedSettings SavedSettings
LastUsedSettings.json LastUsedSettings.json
CustomAppsList CustomAppsList
Logs/*
Win11Debloat.log Win11Debloat.log

View File

@@ -1,77 +1,246 @@
{ {
"Version": "1.0", "Version": "1.0",
"Categories": [ "Categories": [
"Start Menu", {
"System", "Name": "Privacy & Suggested Content",
"Privacy & Suggested Content", "Icon": ""
"Taskbar", },
"Appearance", {
"AI", "Name": "System",
"Other", "Icon": ""
"File Explorer", },
"Gaming" {
"Name": "Start Menu",
"Icon": ""
},
{
"Name": "AI",
"Icon": ""
},
{
"Name": "Windows Update",
"Icon": ""
},
{
"Name": "Taskbar",
"Icon": ""
},
{
"Name": "Appearance",
"Icon": ""
},
{
"Name": "File Explorer",
"Icon": ""
},
{
"Name": "Multi-tasking",
"Icon": ""
},
{
"Name": "Other",
"Icon": ""
},
{
"Name": "Gaming",
"Icon": ""
}
], ],
"UiGroups": [ "UiGroups": [
{ {
"GroupId": "SearchIcon", "GroupId": "SearchIcon",
"Label": "Taskbar search style", "Label": "Taskbar search style",
"ToolTip": "This setting allows you to customize the appearance of the search box on the taskbar.",
"Category": "Taskbar", "Category": "Taskbar",
"Priority": 2, "Priority": 2,
"Values": [ "Values": [
{ "Label": "Hide", "FeatureIds": ["HideSearchTb"] }, {
{ "Label": "Show search icon only", "FeatureIds": ["ShowSearchIconTb"] }, "Label": "Hide",
{ "Label": "Show search icon and label", "FeatureIds": ["ShowSearchLabelTb"] }, "FeatureIds": [
{ "Label": "Show search box", "FeatureIds": ["ShowSearchBoxTb"] } "HideSearchTb"
]
},
{
"Label": "Show search icon only",
"FeatureIds": [
"ShowSearchIconTb"
]
},
{
"Label": "Show search icon and label",
"FeatureIds": [
"ShowSearchLabelTb"
]
},
{
"Label": "Show search box",
"FeatureIds": [
"ShowSearchBoxTb"
]
}
] ]
}, },
{ {
"GroupId": "MultiMon", "GroupId": "MultiMon",
"Label": "Show taskbar apps on", "Label": "Show taskbar apps on",
"ToolTip": "This setting allows you to choose where taskbar app buttons are shown when using multiple monitors.",
"Category": "Taskbar", "Category": "Taskbar",
"Values": [ "Values": [
{ "Label": "All taskbars", "FeatureIds": ["MMTaskbarModeAll"] }, {
{ "Label": "Main taskbar and taskbar where window is open", "FeatureIds": ["MMTaskbarModeMainActive"] }, "Label": "All taskbars",
{ "Label": "Taskbar where window is open", "FeatureIds": ["MMTaskbarModeActive"] } "FeatureIds": [
"MMTaskbarModeAll"
]
},
{
"Label": "Main taskbar and taskbar where window is open",
"FeatureIds": [
"MMTaskbarModeMainActive"
]
},
{
"Label": "Taskbar where window is open",
"FeatureIds": [
"MMTaskbarModeActive"
]
}
] ]
}, },
{ {
"GroupId": "CombineButtons", "GroupId": "CombineButtons",
"Label": "Combine taskbar buttons on the main display", "Label": "Combine taskbar buttons on the main display",
"ToolTip": "This setting allows you to choose how taskbar buttons are combined on the main display.",
"Category": "Taskbar", "Category": "Taskbar",
"Values": [ "Values": [
{ "Label": "Always", "FeatureIds": ["CombineTaskbarAlways"] }, {
{ "Label": "When taskbar is full", "FeatureIds": ["CombineTaskbarWhenFull"] }, "Label": "Always",
{ "Label": "Never", "FeatureIds": ["CombineTaskbarNever"] } "FeatureIds": [
"CombineTaskbarAlways"
]
},
{
"Label": "When taskbar is full",
"FeatureIds": [
"CombineTaskbarWhenFull"
]
},
{
"Label": "Never",
"FeatureIds": [
"CombineTaskbarNever"
]
}
] ]
}, },
{ {
"GroupId": "CombineMMButtons", "GroupId": "CombineMMButtons",
"Label": "Combine taskbar buttons on secondary displays", "Label": "Combine taskbar buttons on secondary displays",
"ToolTip": "This setting allows you to choose how taskbar buttons are combined on secondary displays.",
"Category": "Taskbar", "Category": "Taskbar",
"Values": [ "Values": [
{ "Label": "Always", "FeatureIds": ["CombineMMTaskbarAlways"] }, {
{ "Label": "When taskbar is full", "FeatureIds": ["CombineMMTaskbarWhenFull"] }, "Label": "Always",
{ "Label": "Never", "FeatureIds": ["CombineMMTaskbarNever"] } "FeatureIds": [
"CombineMMTaskbarAlways"
]
},
{
"Label": "When taskbar is full",
"FeatureIds": [
"CombineMMTaskbarWhenFull"
]
},
{
"Label": "Never",
"FeatureIds": [
"CombineMMTaskbarNever"
]
}
] ]
}, },
{ {
"GroupId": "ClearStart", "GroupId": "ClearStart",
"Label": "Remove pinned apps from the start menu", "Label": "Remove pinned apps from the start menu",
"ToolTip": "This setting allows you to quickly remove all pinned apps from the start menu.",
"Category": "Start Menu", "Category": "Start Menu",
"Values": [ "Values": [
{ "Label": "Remove for the current user", "FeatureIds": ["ClearStart"] }, {
{ "Label": "Remove for all users", "FeatureIds": ["ClearStartAllUsers"] } "Label": "Remove for the current user",
"FeatureIds": [
"ClearStart"
]
},
{
"Label": "Remove for all users",
"FeatureIds": [
"ClearStartAllUsers"
]
}
] ]
}, },
{ {
"GroupId": "ExplorerLocation", "GroupId": "ExplorerLocation",
"Label": "Open File Explorer to", "Label": "Open File Explorer to",
"ToolTip": "This setting allows you to choose the default location that File Explorer opens to.",
"Category": "File Explorer", "Category": "File Explorer",
"Values": [ "Values": [
{ "Label": "Home", "FeatureIds": ["ExplorerToHome"] }, {
{ "Label": "This PC", "FeatureIds": ["ExplorerToThisPC"] }, "Label": "Home",
{ "Label": "Downloads", "FeatureIds": ["ExplorerToDownloads"] }, "FeatureIds": [
{ "Label": "OneDrive", "FeatureIds": ["ExplorerToOneDrive"] } "ExplorerToHome"
]
},
{
"Label": "This PC",
"FeatureIds": [
"ExplorerToThisPC"
]
},
{
"Label": "Downloads",
"FeatureIds": [
"ExplorerToDownloads"
]
},
{
"Label": "OneDrive",
"FeatureIds": [
"ExplorerToOneDrive"
]
}
]
},
{
"GroupId": "ShowTabsInAltTab",
"Label": "Show tabs from apps when snapping or pressing Alt+Tab",
"ToolTip": "This setting allows you to choose whether to show tabs from apps (such as Edge browser tabs) when snapping windows or pressing Alt+Tab.",
"Category": "Multi-tasking",
"Priority": 10,
"Values": [
{
"Label": "Don't show tabs",
"FeatureIds": [
"HideTabsInAltTab"
]
},
{
"Label": "Show 3 most recent tabs",
"FeatureIds": [
"Show3TabsInAltTab"
]
},
{
"Label": "Show 5 most recent tabs",
"FeatureIds": [
"Show5TabsInAltTab"
]
},
{
"Label": "Show 20 most recent tabs",
"FeatureIds": [
"Show20TabsInAltTab"
]
}
] ]
} }
], ],
@@ -175,6 +344,7 @@
{ {
"FeatureId": "DisableTelemetry", "FeatureId": "DisableTelemetry",
"Label": "telemetry, tracking & targeted ads", "Label": "telemetry, tracking & targeted ads",
"ToolTip": "This setting disables telemetry, diagnostic data collection, activity history, app-launch tracking, targeted ads and more. It limits the data that is sent to Microsoft about your device and usage.",
"Category": "Privacy & Suggested Content", "Category": "Privacy & Suggested Content",
"Action": "Disable", "Action": "Disable",
"RegistryKey": "Disable_Telemetry.reg", "RegistryKey": "Disable_Telemetry.reg",
@@ -186,11 +356,12 @@
}, },
{ {
"FeatureId": "DisableSuggestions", "FeatureId": "DisableSuggestions",
"Label": "tips, tricks & suggested content", "Label": "tips, tricks & suggested content throughout Windows",
"ToolTip": "This setting removes many annoying distractions from Windows.",
"Category": "Privacy & Suggested Content", "Category": "Privacy & Suggested Content",
"Action": "Disable", "Action": "Disable",
"RegistryKey": "Disable_Windows_Suggestions.reg", "RegistryKey": "Disable_Windows_Suggestions.reg",
"ApplyText": "> Disabling tips, tricks, suggestions and ads across Windows...", "ApplyText": "> Disabling tips, tricks, suggestions and ads throughout Windows...",
"UndoAction": "Enable", "UndoAction": "Enable",
"RegistryUndoKey": "Enable_Windows_Suggestions.reg", "RegistryUndoKey": "Enable_Windows_Suggestions.reg",
"MinVersion": null, "MinVersion": null,
@@ -199,6 +370,7 @@
{ {
"FeatureId": "DisableLockscreenTips", "FeatureId": "DisableLockscreenTips",
"Label": "tips & tricks on the lock screen", "Label": "tips & tricks on the lock screen",
"ToolTip": "This will turn off the tips, tricks and fun facts that appear on the lock screen.",
"Category": "Privacy & Suggested Content", "Category": "Privacy & Suggested Content",
"Action": "Disable", "Action": "Disable",
"RegistryKey": "Disable_Lockscreen_Tips.reg", "RegistryKey": "Disable_Lockscreen_Tips.reg",
@@ -211,6 +383,7 @@
{ {
"FeatureId": "DisableDesktopSpotlight", "FeatureId": "DisableDesktopSpotlight",
"Label": "Windows Spotlight for desktop", "Label": "Windows Spotlight for desktop",
"ToolTip": "This will turn off the 'Windows Spotlight' feature for the desktop background, which shows different background images and occasionally tips and fun facts on the desktop.",
"Category": "Privacy & Suggested Content", "Category": "Privacy & Suggested Content",
"Action": "Disable", "Action": "Disable",
"RegistryKey": "Disable_Desktop_Spotlight.reg", "RegistryKey": "Disable_Desktop_Spotlight.reg",
@@ -223,6 +396,7 @@
{ {
"FeatureId": "DisableEdgeAds", "FeatureId": "DisableEdgeAds",
"Label": "ads, suggestions and newsfeed in Edge", "Label": "ads, suggestions and newsfeed in Edge",
"ToolTip": "This will turn off various distractions from Microsoft Edge such as ads, suggestions and the MSN news feed. This setting uses policies, which means some settings will be locked.",
"Category": "Privacy & Suggested Content", "Category": "Privacy & Suggested Content",
"Action": "Disable", "Action": "Disable",
"RegistryKey": "Disable_Edge_Ads_And_Suggestions.reg", "RegistryKey": "Disable_Edge_Ads_And_Suggestions.reg",
@@ -235,6 +409,7 @@
{ {
"FeatureId": "DisableCopilot", "FeatureId": "DisableCopilot",
"Label": "Microsoft Copilot", "Label": "Microsoft Copilot",
"ToolTip": "This will disable and uninstall Microsoft Copilot, Windows' built-in AI assistant.",
"Category": "AI", "Category": "AI",
"Action": "Disable", "Action": "Disable",
"RegistryKey": "Disable_Copilot.reg", "RegistryKey": "Disable_Copilot.reg",
@@ -247,6 +422,7 @@
{ {
"FeatureId": "DisableRecall", "FeatureId": "DisableRecall",
"Label": "Windows Recall", "Label": "Windows Recall",
"ToolTip": "This will disable Windows Recall, an AI-powered feature that provides quick access to recently used files, apps and activities.",
"Category": "AI", "Category": "AI",
"Action": "Disable", "Action": "Disable",
"RegistryKey": "Disable_AI_Recall.reg", "RegistryKey": "Disable_AI_Recall.reg",
@@ -259,6 +435,7 @@
{ {
"FeatureId": "DisableClickToDo", "FeatureId": "DisableClickToDo",
"Label": "Click To Do, AI text & image analysis", "Label": "Click To Do, AI text & image analysis",
"ToolTip": "This will disable Click To Do, which provides AI-powered text and image analysis features in Windows.",
"Category": "AI", "Category": "AI",
"Action": "Disable", "Action": "Disable",
"RegistryKey": "Disable_Click_to_Do.reg", "RegistryKey": "Disable_Click_to_Do.reg",
@@ -271,6 +448,7 @@
{ {
"FeatureId": "DisableDVR", "FeatureId": "DisableDVR",
"Label": "Xbox game/screen recording", "Label": "Xbox game/screen recording",
"ToolTip": "This will disable the Xbox game/screen recording features included with the Game Bar app.",
"Category": "Gaming", "Category": "Gaming",
"Action": "Disable", "Action": "Disable",
"RegistryKey": "Disable_DVR.reg", "RegistryKey": "Disable_DVR.reg",
@@ -283,6 +461,7 @@
{ {
"FeatureId": "DisableGameBarIntegration", "FeatureId": "DisableGameBarIntegration",
"Label": "Game Bar integration", "Label": "Game Bar integration",
"ToolTip": "This will disable the Game Bar integration with games and controllers. This stops annoying ms-gamebar popups when launching games or connecting a controller.",
"Category": "Gaming", "Category": "Gaming",
"Action": "Disable", "Action": "Disable",
"RegistryKey": "Disable_Game_Bar_Integration.reg", "RegistryKey": "Disable_Game_Bar_Integration.reg",
@@ -343,6 +522,7 @@
{ {
"FeatureId": "DisableStartRecommended", "FeatureId": "DisableStartRecommended",
"Label": "recommended section in the start menu", "Label": "recommended section in the start menu",
"ToolTip": "This will hide the recommended section in the start menu, which shows recently added apps, recently opened files and app recommendations.",
"Category": "Start Menu", "Category": "Start Menu",
"Action": "Hide", "Action": "Hide",
"RegistryKey": "Disable_Start_Recommended.reg", "RegistryKey": "Disable_Start_Recommended.reg",
@@ -350,11 +530,12 @@
"UndoAction": "Show", "UndoAction": "Show",
"RegistryUndoKey": "Enable_Start_Recommended.reg", "RegistryUndoKey": "Enable_Start_Recommended.reg",
"MinVersion": 22621, "MinVersion": 22621,
"MaxVersion": 26199 "MaxVersion": null
}, },
{ {
"FeatureId": "DisableBing", "FeatureId": "DisableBing",
"Label": "Bing web search & Copilot integration", "Label": "Bing web search & Copilot integration",
"ToolTip": "This will turn off Bing web search results and Copilot integration in the Windows search experience.",
"Category": "Start Menu", "Category": "Start Menu",
"Action": "Disable", "Action": "Disable",
"RegistryKey": "Disable_Bing_Cortana_In_Search.reg", "RegistryKey": "Disable_Bing_Cortana_In_Search.reg",
@@ -367,6 +548,7 @@
{ {
"FeatureId": "DisableStartPhoneLink", "FeatureId": "DisableStartPhoneLink",
"Label": "Phone Link integration in the start menu", "Label": "Phone Link integration in the start menu",
"ToolTip": "This will remove the Phone Link integration in the start menu when you have a mobile device linked to your PC.",
"Category": "Start Menu", "Category": "Start Menu",
"Action": "Disable", "Action": "Disable",
"RegistryKey": "Disable_Phone_Link_In_Start.reg", "RegistryKey": "Disable_Phone_Link_In_Start.reg",
@@ -378,11 +560,12 @@
}, },
{ {
"FeatureId": "DisableSettings365Ads", "FeatureId": "DisableSettings365Ads",
"Label": "Microsoft 365 ads in Settings Home", "Label": "Microsoft 365 Copilot ads in Settings Home",
"ToolTip": "This will turn off the Microsoft 365 Copilot ads that appear in the Settings Home page.",
"Category": "Privacy & Suggested Content", "Category": "Privacy & Suggested Content",
"Action": "Hide", "Action": "Hide",
"RegistryKey": "Disable_Settings_365_Ads.reg", "RegistryKey": "Disable_Settings_365_Ads.reg",
"ApplyText": "> Disabling Microsoft 365 ads in Settings Home...", "ApplyText": "> Disabling Microsoft 365 Copilot ads in Settings Home...",
"UndoAction": "Show", "UndoAction": "Show",
"RegistryUndoKey": "Enable_Settings_365_Ads.reg", "RegistryUndoKey": "Enable_Settings_365_Ads.reg",
"MinVersion": null, "MinVersion": null,
@@ -391,7 +574,8 @@
{ {
"FeatureId": "DisableSettingsHome", "FeatureId": "DisableSettingsHome",
"Label": "Settings 'Home' page", "Label": "Settings 'Home' page",
"Category": "Privacy & Suggested Content", "ToolTip": "Removes the 'Home' page from the Settings app.",
"Category": "Other",
"Action": "Hide", "Action": "Hide",
"RegistryKey": "Disable_Settings_Home.reg", "RegistryKey": "Disable_Settings_Home.reg",
"ApplyText": "> Disabling the Settings Home page...", "ApplyText": "> Disabling the Settings Home page...",
@@ -403,6 +587,7 @@
{ {
"FeatureId": "DisableEdgeAI", "FeatureId": "DisableEdgeAI",
"Label": "AI features in Microsoft Edge", "Label": "AI features in Microsoft Edge",
"ToolTip": "This will turn off AI features in Microsoft Edge, such as the AI-powered sidebar and Copilot features. This setting uses policies, which means some settings will be locked.",
"Category": "AI", "Category": "AI",
"Action": "Disable", "Action": "Disable",
"RegistryKey": "Disable_Edge_AI_Features.reg", "RegistryKey": "Disable_Edge_AI_Features.reg",
@@ -415,6 +600,7 @@
{ {
"FeatureId": "DisablePaintAI", "FeatureId": "DisablePaintAI",
"Label": "AI features in Paint", "Label": "AI features in Paint",
"ToolTip": "This will turn off AI features in Paint, such as the AI-powered image generation and editing tools.",
"Category": "AI", "Category": "AI",
"Action": "Disable", "Action": "Disable",
"RegistryKey": "Disable_Paint_AI_Features.reg", "RegistryKey": "Disable_Paint_AI_Features.reg",
@@ -427,6 +613,7 @@
{ {
"FeatureId": "DisableNotepadAI", "FeatureId": "DisableNotepadAI",
"Label": "AI features in Notepad", "Label": "AI features in Notepad",
"ToolTip": "This will turn off AI features in Notepad, such as the AI-powered writing suggestions.",
"Category": "AI", "Category": "AI",
"Action": "Disable", "Action": "Disable",
"RegistryKey": "Disable_Notepad_AI_Features.reg", "RegistryKey": "Disable_Notepad_AI_Features.reg",
@@ -439,6 +626,7 @@
{ {
"FeatureId": "EnableDarkMode", "FeatureId": "EnableDarkMode",
"Label": "theme for system and apps", "Label": "theme for system and apps",
"ToolTip": "This will set the app and system theme to dark mode.",
"Category": "Appearance", "Category": "Appearance",
"Action": "Enable dark", "Action": "Enable dark",
"RegistryKey": "Enable_Dark_Mode.reg", "RegistryKey": "Enable_Dark_Mode.reg",
@@ -451,6 +639,7 @@
{ {
"FeatureId": "DisableDragTray", "FeatureId": "DisableDragTray",
"Label": "'Drag Tray' for sharing & moving files", "Label": "'Drag Tray' for sharing & moving files",
"ToolTip": "The Drag Tray is a new feature for sharing & moving files in Windows 11, it appears at the top of the screen when dragging files.",
"Category": "System", "Category": "System",
"Action": "Disable", "Action": "Disable",
"RegistryKey": "Disable_Share_Drag_Tray.reg", "RegistryKey": "Disable_Share_Drag_Tray.reg",
@@ -463,6 +652,7 @@
{ {
"FeatureId": "RevertContextMenu", "FeatureId": "RevertContextMenu",
"Label": "context menu style", "Label": "context menu style",
"ToolTip": "This will restore the classic Windows 10 style context menu instead of the modern Windows 11 style menu.",
"Category": "System", "Category": "System",
"Action": "Use classic Windows 10", "Action": "Use classic Windows 10",
"RegistryKey": "Disable_Show_More_Options_Context_Menu.reg", "RegistryKey": "Disable_Show_More_Options_Context_Menu.reg",
@@ -475,6 +665,7 @@
{ {
"FeatureId": "DisableMouseAcceleration", "FeatureId": "DisableMouseAcceleration",
"Label": "Enhance Pointer Precision (mouse acceleration)", "Label": "Enhance Pointer Precision (mouse acceleration)",
"ToolTip": "This will disable mouse acceleration which is enabled by default in Windows. This makes mouse movement more consistent and predictable.",
"Category": "System", "Category": "System",
"Action": "Disable", "Action": "Disable",
"RegistryKey": "Disable_Enhance_Pointer_Precision.reg", "RegistryKey": "Disable_Enhance_Pointer_Precision.reg",
@@ -486,7 +677,8 @@
}, },
{ {
"FeatureId": "DisableStickyKeys", "FeatureId": "DisableStickyKeys",
"Label": "Sticky Keys keyboard shortcut", "Label": "Sticky Keys keyboard shortcut (5x shift)",
"ToolTip": "This will prevent the Sticky Keys dialog from appearing when you press the Shift key 5 times in a row.",
"Category": "System", "Category": "System",
"Action": "Disable", "Action": "Disable",
"RegistryKey": "Disable_Sticky_Keys_Shortcut.reg", "RegistryKey": "Disable_Sticky_Keys_Shortcut.reg",
@@ -496,9 +688,100 @@
"MinVersion": 26100, "MinVersion": 26100,
"MaxVersion": null "MaxVersion": null
}, },
{
"FeatureId": "DisableWindowSnapping",
"Label": "window snapping",
"ToolTip": "This will turn off the ability to snap windows to the sides or corners of the screen.",
"Category": "Multi-tasking",
"Priority": 1,
"Action": "Disable",
"RegistryKey": "Disable_Window_Snapping.reg",
"ApplyText": "> Disabling window snapping...",
"UndoAction": "Enable",
"RegistryUndoKey": "Enable_Window_Snapping.reg",
"MinVersion": null,
"MaxVersion": null
},
{
"FeatureId": "DisableSnapAssist",
"Label": "showing app suggestions when snapping windows",
"ToolTip": "This will turn off app suggestions when you snap windows to the sides or corners of the screen.",
"Category": "Multi-tasking",
"Priority": 2,
"Action": "Disable",
"RegistryKey": "Disable_Snap_Assist.reg",
"ApplyText": "> Disabling the Snap Assist suggestions...",
"UndoAction": "Enable",
"RegistryUndoKey": "Enable_Snap_Assist.reg",
"MinVersion": 22000,
"MaxVersion": null
},
{
"FeatureId": "DisableSnapLayouts",
"Label": "snap layout flyout at top of screen and on maximize button",
"ToolTip": "This will turn off the snap layout flyout that appears when you hover over the maximize button or drag windows to the top of the screen.",
"Category": "Multi-tasking",
"Priority": 3,
"Action": "Hide",
"RegistryKey": "Disable_Snap_Layouts.reg",
"ApplyText": "> Hiding snap layouts when dragging windows to top of the screen and on maximize button...",
"UndoAction": "Show",
"RegistryUndoKey": "Enable_Snap_Layouts.reg",
"MinVersion": 22000,
"MaxVersion": null
},
{
"FeatureId": "HideTabsInAltTab",
"Label": "tabs from apps when snapping or pressing Alt+Tab",
"Category": "Multi-tasking",
"Action": "Hide",
"RegistryKey": "Hide_Tabs_In_Alt_Tab.reg",
"ApplyText": "> Disable showing tabs from apps when snapping or pressing Alt+Tab...",
"UndoAction": null,
"RegistryUndoKey": null,
"MinVersion": 22000,
"MaxVersion": null
},
{
"FeatureId": "Show3TabsInAltTab",
"Label": "tabs from apps when snapping or pressing Alt+Tab",
"Category": "Multi-tasking",
"Action": "Show 3",
"RegistryKey": "Show_3_Tabs_In_Alt_Tab.reg",
"ApplyText": "> Enable showing 3 tabs from apps when snapping or pressing Alt+Tab...",
"UndoAction": null,
"RegistryUndoKey": null,
"MinVersion": 22000,
"MaxVersion": null
},
{
"FeatureId": "Show5TabsInAltTab",
"Label": "tabs from apps when snapping or pressing Alt+Tab",
"Category": "Multi-tasking",
"Action": "Show 5",
"RegistryKey": "Show_5_Tabs_In_Alt_Tab.reg",
"ApplyText": "> Enable showing 5 tabs from apps when snapping or pressing Alt+Tab...",
"UndoAction": null,
"RegistryUndoKey": null,
"MinVersion": 22000,
"MaxVersion": null
},
{
"FeatureId": "Show20TabsInAltTab",
"Label": "tabs from apps when snapping or pressing Alt+Tab",
"Category": "Multi-tasking",
"Action": "Show 20",
"RegistryKey": "Show_20_Tabs_In_Alt_Tab.reg",
"ApplyText": "> Enable showing 20 tabs from apps when snapping or pressing Alt+Tab...",
"UndoAction": null,
"RegistryUndoKey": null,
"MinVersion": 22000,
"MaxVersion": null
},
{ {
"FeatureId": "TaskbarAlignLeft", "FeatureId": "TaskbarAlignLeft",
"Label": "taskbar alignment", "Label": "taskbar alignment",
"ToolTip": "By default, Windows 11 has the taskbar buttons centered. Enabling this setting will move the taskbar buttons to the left, similar to previous versions of Windows.",
"Category": "Taskbar", "Category": "Taskbar",
"Priority": 1, "Priority": 1,
"Action": "Left", "Action": "Left",
@@ -560,6 +843,7 @@
{ {
"FeatureId": "HideTaskview", "FeatureId": "HideTaskview",
"Label": "'Task view' button on the taskbar", "Label": "'Task view' button on the taskbar",
"ToolTip": "This will disable the 'Task view' button on the taskbar, which allows you to see all your open windows and virtual desktops.",
"Category": "Taskbar", "Category": "Taskbar",
"Priority": 3, "Priority": 3,
"Action": "Hide", "Action": "Hide",
@@ -573,6 +857,7 @@
{ {
"FeatureId": "DisableWidgets", "FeatureId": "DisableWidgets",
"Label": "widgets on the taskbar & lock screen", "Label": "widgets on the taskbar & lock screen",
"ToolTip": "This will disable the widgets features in Windows, including the widgets button on the taskbar and the widgets that can appear on the lock screen.",
"Category": "Taskbar", "Category": "Taskbar",
"Priority": 4, "Priority": 4,
"Action": "Disable", "Action": "Disable",
@@ -586,6 +871,7 @@
{ {
"FeatureId": "HideChat", "FeatureId": "HideChat",
"Label": "Chat (meet now) icon on the taskbar", "Label": "Chat (meet now) icon on the taskbar",
"ToolTip": "This will disable the Chat (meet now) icon on the taskbar.",
"Category": "Taskbar", "Category": "Taskbar",
"Priority": 5, "Priority": 5,
"Action": "Hide", "Action": "Hide",
@@ -599,6 +885,7 @@
{ {
"FeatureId": "DisableFastStartup", "FeatureId": "DisableFastStartup",
"Label": "fast start-up", "Label": "fast start-up",
"ToolTip": "Fast Start-up helps your PC start faster after shutdown by saving a system image to disk. Disabling Fast Start-up can help with certain issues, but may result in slightly longer boot times.",
"Category": "System", "Category": "System",
"Action": "Disable", "Action": "Disable",
"RegistryKey": "Disable_Fast_Startup.reg", "RegistryKey": "Disable_Fast_Startup.reg",
@@ -608,9 +895,23 @@
"MinVersion": null, "MinVersion": null,
"MaxVersion": null "MaxVersion": null
}, },
{
"FeatureId": "DisableBitlockerAutoEncryption",
"Label": "BitLocker automatic device encryption",
"ToolTip": "For devices that support it, Windows 11 automatically enables BitLocker device encryption. Disabling this will turn off automatic encryption of the device, but you can still manually enable BitLocker encryption if desired.",
"Category": "System",
"Action": "Disable",
"RegistryKey": "Disable_Bitlocker_Auto_Encryption.reg",
"ApplyText": "> Disabling BitLocker automatic device encryption...",
"UndoAction": "Enable",
"RegistryUndoKey": "Enable_Bitlocker_Auto_Encryption.reg",
"MinVersion": 22000,
"MaxVersion": null
},
{ {
"FeatureId": "DisableModernStandbyNetworking", "FeatureId": "DisableModernStandbyNetworking",
"Label": "Modern Standby network connectivity", "Label": "Modern Standby network connectivity",
"ToolTip": "By default, devices that support Modern Standby maintain network connectivity while in sleep mode. Disabling network connectivity during Modern Standby can help save battery life.",
"Category": "System", "Category": "System",
"Action": "Disable", "Action": "Disable",
"RegistryKey": "Disable_Modern_Standby_Networking.reg", "RegistryKey": "Disable_Modern_Standby_Networking.reg",
@@ -623,6 +924,7 @@
{ {
"FeatureId": "EnableEndTask", "FeatureId": "EnableEndTask",
"Label": "'End Task' option in taskbar context menu", "Label": "'End Task' option in taskbar context menu",
"ToolTip": "When enabled, adds an 'End Task' option to the right-click context menu for apps in the taskbar, allowing you to quickly force close apps.",
"Category": "Taskbar", "Category": "Taskbar",
"Priority": 6, "Priority": 6,
"Action": "Show", "Action": "Show",
@@ -636,6 +938,7 @@
{ {
"FeatureId": "EnableLastActiveClick", "FeatureId": "EnableLastActiveClick",
"Label": "'Last Active Click' behavior for taskbar apps", "Label": "'Last Active Click' behavior for taskbar apps",
"ToolTip": "When enabled, clicking on an app in the taskbar will switch to the last active window of that app, instead of only showing the thumbnail preview.",
"Category": "Taskbar", "Category": "Taskbar",
"Priority": 7, "Priority": 7,
"Action": "Enable", "Action": "Enable",
@@ -805,6 +1108,7 @@
{ {
"FeatureId": "ShowKnownFileExt", "FeatureId": "ShowKnownFileExt",
"Label": "file extensions for known file types", "Label": "file extensions for known file types",
"ToolTip": "This will show file extensions for known file types. By default, Windows hides file extensions for known file types which can lead to confusion and security risks.",
"Category": "File Explorer", "Category": "File Explorer",
"Action": "Show", "Action": "Show",
"RegistryKey": "Show_Extensions_For_Known_File_Types.reg", "RegistryKey": "Show_Extensions_For_Known_File_Types.reg",
@@ -817,6 +1121,7 @@
{ {
"FeatureId": "ShowHiddenFolders", "FeatureId": "ShowHiddenFolders",
"Label": "hidden files, folders and drives", "Label": "hidden files, folders and drives",
"ToolTip": "By default, Windows hides certain files, folders and drives to prevent accidental modification or deletion. Turn this on to show all files in File Explorer.",
"Category": "File Explorer", "Category": "File Explorer",
"Action": "Show", "Action": "Show",
"RegistryKey": "Show_Hidden_Folders.reg", "RegistryKey": "Show_Hidden_Folders.reg",
@@ -829,6 +1134,7 @@
{ {
"FeatureId": "HideHome", "FeatureId": "HideHome",
"Label": "'Home' from navigation pane", "Label": "'Home' from navigation pane",
"ToolTip": "Hides the 'Home' section from the File Explorer navigation pane.",
"Category": "File Explorer", "Category": "File Explorer",
"Action": "Hide", "Action": "Hide",
"RegistryKey": "Hide_Home_from_Explorer.reg", "RegistryKey": "Hide_Home_from_Explorer.reg",
@@ -841,6 +1147,7 @@
{ {
"FeatureId": "HideGallery", "FeatureId": "HideGallery",
"Label": "'Gallery' from navigation pane", "Label": "'Gallery' from navigation pane",
"ToolTip": "Hides the 'Gallery' section from the File Explorer navigation pane.",
"Category": "File Explorer", "Category": "File Explorer",
"Action": "Hide", "Action": "Hide",
"RegistryKey": "Hide_Gallery_from_Explorer.reg", "RegistryKey": "Hide_Gallery_from_Explorer.reg",
@@ -853,6 +1160,7 @@
{ {
"FeatureId": "HideDupliDrive", "FeatureId": "HideDupliDrive",
"Label": "duplicate removable drive entries", "Label": "duplicate removable drive entries",
"ToolTip": "By default, Windows shows removable drives both under 'This PC' and in the navigation pane with its own entry. Enable this setting to only show removable drives under 'This PC'.",
"Category": "File Explorer", "Category": "File Explorer",
"Action": "Hide", "Action": "Hide",
"RegistryKey": "Hide_duplicate_removable_drives_from_navigation_pane_of_File_Explorer.reg", "RegistryKey": "Hide_duplicate_removable_drives_from_navigation_pane_of_File_Explorer.reg",
@@ -865,6 +1173,7 @@
{ {
"FeatureId": "AddFoldersToThisPC", "FeatureId": "AddFoldersToThisPC",
"Label": "common folders back to 'This PC' page", "Label": "common folders back to 'This PC' page",
"ToolTip": "This setting will add common folders like Desktop, Documents, Downloads, Music, Pictures and Videos back to the 'This PC' page in File Explorer.",
"Category": "File Explorer", "Category": "File Explorer",
"Action": "Add", "Action": "Add",
"RegistryKey": "Add_All_Folders_Under_This_PC.reg", "RegistryKey": "Add_All_Folders_Under_This_PC.reg",
@@ -877,6 +1186,7 @@
{ {
"FeatureId": "DisableTransparency", "FeatureId": "DisableTransparency",
"Label": "transparency effects", "Label": "transparency effects",
"ToolTip": "This will disable transparency effects on Windows and interfaces. Which can help improve performance on older hardware.",
"Category": "Appearance", "Category": "Appearance",
"Action": "Disable", "Action": "Disable",
"RegistryKey": "Disable_Transparency.reg", "RegistryKey": "Disable_Transparency.reg",
@@ -889,6 +1199,7 @@
{ {
"FeatureId": "DisableAnimations", "FeatureId": "DisableAnimations",
"Label": "animations and visual effects", "Label": "animations and visual effects",
"ToolTip": "This will disable animations and some visual effects in Windows, which can make the interface feel snappier, especially on older hardware.",
"Category": "Appearance", "Category": "Appearance",
"Action": "Disable", "Action": "Disable",
"RegistryKey": "Disable_Animations.reg", "RegistryKey": "Disable_Animations.reg",
@@ -898,6 +1209,45 @@
"MinVersion": null, "MinVersion": null,
"MaxVersion": null "MaxVersion": null
}, },
{
"FeatureId": "DisableUpdateASAP",
"Label": "updates as soon as they're available",
"ToolTip": "This will prevent your PC from being among the first to receive new non-security updates. Your PC will still receive these updates eventually.",
"Category": "Windows Update",
"Action": "Prevent getting",
"RegistryKey": "Disable_Update_ASAP.reg",
"ApplyText": "> Preventing Windows from getting updates as soon as they are available...",
"UndoAction": "Get",
"RegistryUndoKey": "Enable_Update_ASAP.reg",
"MinVersion": null,
"MaxVersion": null
},
{
"FeatureId": "PreventUpdateAutoReboot",
"Label": "automatic restarts after updates while signed in",
"ToolTip": "This will prevent your PC from automatically restarting after updates while any user is signed in.",
"Category": "Windows Update",
"Action": "Prevent",
"RegistryKey": "Prevent_Auto_Reboot.reg",
"ApplyText": "> Preventing automatic restarts after updates while signed in...",
"UndoAction": "Allow",
"RegistryUndoKey": "Allow_Auto_Reboot.reg",
"MinVersion": null,
"MaxVersion": null
},
{
"FeatureId": "DisableDeliveryOptimization",
"Label": "sharing downloaded updates with other PCs",
"ToolTip": "This will prevent your PC from sharing downloaded updates with other PCs on the local network or on the internet. This also prevents your PC from downloading updates from other PCs.",
"Category": "Windows Update",
"Action": "Disable",
"RegistryKey": "Disable_Delivery_Optimization.reg",
"ApplyText": "> Disabling sharing of downloaded updates with other PCs...",
"UndoAction": "Enable",
"RegistryUndoKey": "Enable_Delivery_Optimization.reg",
"MinVersion": null,
"MaxVersion": null
},
{ {
"FeatureId": "ForceRemoveEdge", "FeatureId": "ForceRemoveEdge",
"Label": "Forcefully uninstall Microsoft Edge. NOT RECOMMENDED!", "Label": "Forcefully uninstall Microsoft Edge. NOT RECOMMENDED!",
@@ -913,6 +1263,7 @@
{ {
"FeatureId": "HideIncludeInLibrary", "FeatureId": "HideIncludeInLibrary",
"Label": "'Include in library' option in the context menu", "Label": "'Include in library' option in the context menu",
"ToolTip": "Hides the 'Include in library' option from the File Explorer context menu.",
"Category": "File Explorer", "Category": "File Explorer",
"Action": "Hide", "Action": "Hide",
"RegistryKey": "Disable_Include_in_library_from_context_menu.reg", "RegistryKey": "Disable_Include_in_library_from_context_menu.reg",
@@ -925,6 +1276,7 @@
{ {
"FeatureId": "HideGiveAccessTo", "FeatureId": "HideGiveAccessTo",
"Label": "'Give access to' option in the context menu", "Label": "'Give access to' option in the context menu",
"ToolTip": "Hides the 'Give access to' option from the File Explorer context menu.",
"Category": "File Explorer", "Category": "File Explorer",
"Action": "Hide", "Action": "Hide",
"RegistryKey": "Disable_Give_access_to_context_menu.reg", "RegistryKey": "Disable_Give_access_to_context_menu.reg",
@@ -937,6 +1289,7 @@
{ {
"FeatureId": "HideShare", "FeatureId": "HideShare",
"Label": "'Share' option in the context menu", "Label": "'Share' option in the context menu",
"ToolTip": "Hides the 'Share' option from the File Explorer context menu.",
"Category": "File Explorer", "Category": "File Explorer",
"Action": "Hide", "Action": "Hide",
"RegistryKey": "Disable_Share_from_context_menu.reg", "RegistryKey": "Disable_Share_from_context_menu.reg",
@@ -949,6 +1302,7 @@
{ {
"FeatureId": "HideOnedrive", "FeatureId": "HideOnedrive",
"Label": "'OneDrive' folder from navigation pane", "Label": "'OneDrive' folder from navigation pane",
"ToolTip": "Hides the 'OneDrive' folder from the File Explorer navigation pane.",
"Category": "File Explorer", "Category": "File Explorer",
"Action": "Hide", "Action": "Hide",
"RegistryKey": "Hide_Onedrive_Folder.reg", "RegistryKey": "Hide_Onedrive_Folder.reg",
@@ -961,6 +1315,7 @@
{ {
"FeatureId": "Hide3dObjects", "FeatureId": "Hide3dObjects",
"Label": "'3D objects' folder under 'This PC'", "Label": "'3D objects' folder under 'This PC'",
"ToolTip": "Hides the '3D objects' folder from the File Explorer navigation pane.",
"Category": "File Explorer", "Category": "File Explorer",
"Action": "Hide", "Action": "Hide",
"RegistryKey": "Hide_3D_Objects_Folder.reg", "RegistryKey": "Hide_3D_Objects_Folder.reg",
@@ -973,6 +1328,7 @@
{ {
"FeatureId": "HideMusic", "FeatureId": "HideMusic",
"Label": "'Music' folder under 'This PC'", "Label": "'Music' folder under 'This PC'",
"ToolTip": "Hides the 'Music' folder from the File Explorer navigation pane.",
"Category": "File Explorer", "Category": "File Explorer",
"Action": "Hide", "Action": "Hide",
"RegistryKey": "Hide_Music_Folder.reg", "RegistryKey": "Hide_Music_Folder.reg",
@@ -985,6 +1341,7 @@
{ {
"FeatureId": "DisableBraveBloat", "FeatureId": "DisableBraveBloat",
"Label": "bloat in Brave browser (AI, Crypto, etc.)", "Label": "bloat in Brave browser (AI, Crypto, etc.)",
"ToolTip": "This will disable Brave's built-in AI features, Crypto wallet, News, Rewards, Talk and VPN.",
"Category": "Other", "Category": "Other",
"Action": "Disable", "Action": "Disable",
"RegistryKey": "Disable_Brave_Bloat.reg", "RegistryKey": "Disable_Brave_Bloat.reg",
@@ -995,4 +1352,4 @@
"MaxVersion": null "MaxVersion": null
} }
] ]
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 486 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 287 KiB

View File

@@ -1,17 +1,3 @@
<div align="center" markdown="1">
<sup>Special thanks to:</sup>
<br>
<br>
<a href="https://www.warp.dev/windebloat">
<img alt="Warp sponsorship" width="400" src="https://github.com/user-attachments/assets/c21102f7-bab9-4344-a731-0cf6b341cab2">
</a>
### [Warp, the intelligent terminal for developers](https://www.warp.dev/windebloat)
[Available for MacOS, Linux, & Windows](https://www.warp.dev/windebloat)<br>
</div>
<hr>
# Win11Debloat # Win11Debloat
[![GitHub Release](https://img.shields.io/github/v/release/Raphire/Win11Debloat?style=for-the-badge&label=Latest%20release)](https://github.com/Raphire/Win11Debloat/releases/latest) [![GitHub Release](https://img.shields.io/github/v/release/Raphire/Win11Debloat?style=for-the-badge&label=Latest%20release)](https://github.com/Raphire/Win11Debloat/releases/latest)
@@ -47,7 +33,7 @@ Download & run the script automatically via PowerShell.
3. Wait for the script to automatically download Win11Debloat. 3. Wait for the script to automatically download Win11Debloat.
4. Carefully read through and follow the on-screen instructions. 4. Carefully read through and follow the on-screen instructions.
This method supports command-line parameters to customize the behaviour of the script. Please click [here](https://github.com/Raphire/Win11Debloat/wiki/How-To-Use#parameters) for more information. This method supports command-line parameters to customize the behaviour of the script. Please click [here](https://github.com/Raphire/Win11Debloat/wiki/Command%E2%80%90line-Interface#parameters) for more information.
### Traditional method ### Traditional method
@@ -83,7 +69,7 @@ This method supports command-line parameters to customize the behaviour of the s
6. Carefully read through and follow the on-screen instructions. 6. Carefully read through and follow the on-screen instructions.
This method supports command-line parameters to customize the behaviour of the script. Please click [here](https://github.com/Raphire/Win11Debloat/wiki/How-To-Use#parameters) for more information. This method supports command-line parameters to customize the behaviour of the script. Please click [here](https://github.com/Raphire/Win11Debloat/wiki/Command%E2%80%90line-Interface#parameters) for more information.
</details> </details>
## Features ## Features
@@ -122,8 +108,15 @@ Below is an overview of the key features and functionality offered by Win11Deblo
- Turn off Enhance Pointer Precision, also known as mouse acceleration. - Turn off Enhance Pointer Precision, also known as mouse acceleration.
- Disable the Sticky Keys keyboard shortcut. (W11 only) - Disable the Sticky Keys keyboard shortcut. (W11 only)
- Disable fast start-up to ensure a full shutdown. - Disable fast start-up to ensure a full shutdown.
- Disable BitLocker automatic device encryption.
- Disable network connectivity during Modern Standby to reduce battery drain. (W11 only) - Disable network connectivity during Modern Standby to reduce battery drain. (W11 only)
#### Windows Update
- Prevent Windows from getting updates as soon as they're available.
- Prevent automatic restarts after updates while signed in.
- Disable sharing of downloaded updates with other PCs, also known as Delivery Optimization.
#### Appearance #### Appearance
- Enable dark mode for system and apps. - Enable dark mode for system and apps.
@@ -160,6 +153,13 @@ Below is an overview of the key features and functionality offered by Win11Deblo
- Hide the 3D objects, music or OneDrive folder from the File Explorer navigation pane. (W10 only) - Hide the 3D objects, music or OneDrive folder from the File Explorer navigation pane. (W10 only)
- Hide the 'Include in library', 'Give access to' and 'Share' options from the context menu. (W10 only) - Hide the 'Include in library', 'Give access to' and 'Share' options from the context menu. (W10 only)
#### Multi-tasking
- Disable window snapping. (W11 only)
- Disable Snap Assist suggestions when snapping a window. (W11 only)
- Disable Snap Layout suggestions when dragging windows to the top of screen and when hovering on the maximize button. (W11 only)
- Change if tabs are shown when snapping or pressing Alt+Tab. (W11 only)
#### Other #### Other
- Disable Xbox Game Bar integration & game/screen recording. This also disables `ms-gamingoverlay`/`ms-gamebar` popups if you uninstall the Xbox Game Bar. - Disable Xbox Game Bar integration & game/screen recording. This also disables `ms-gamingoverlay`/`ms-gamebar` popups if you uninstall the Xbox Game Bar.

View File

@@ -0,0 +1,4 @@
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\BitLocker]
"PreventDeviceEncryption"=dword:00000001

View File

@@ -0,0 +1,5 @@
Windows Registry Editor Version 5.00
; Disable sharing downloaded updates with other PCs (Delivery Optimization)
[HKEY_USERS\S-1-5-20\Software\Microsoft\Windows\CurrentVersion\DeliveryOptimization\Settings]
"DownloadMode"=dword:00000000

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,5 @@
Windows Registry Editor Version 5.00
; Turn Off "Get the latest updates as soon as they're available"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings]
"IsContinuousInnovationOptedIn"=dword:00000000

View File

@@ -0,0 +1,4 @@
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Control Panel\Desktop]
"WindowArrangementActive"="0"

View File

@@ -0,0 +1,4 @@
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
"MultiTaskingAltTabFilter"=dword:00000003

View File

@@ -0,0 +1,5 @@
Windows Registry Editor Version 5.00
; Prevent automatic restarts after updates while signed in
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU]
"NoAutoRebootWithLoggedOnUsers"=dword:00000001

View File

@@ -0,0 +1,4 @@
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
"MultiTaskingAltTabFilter"=dword:00000000

View File

@@ -0,0 +1,4 @@
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
"MultiTaskingAltTabFilter"=dword:00000002

View File

@@ -0,0 +1,4 @@
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
"MultiTaskingAltTabFilter"=dword:00000001

View File

@@ -0,0 +1,4 @@
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\BitLocker]
"PreventDeviceEncryption"=dword:00000001

View File

@@ -0,0 +1,5 @@
Windows Registry Editor Version 5.00
; Disable sharing downloaded updates with other PCs (Delivery Optimization)
[HKEY_USERS\S-1-5-20\Software\Microsoft\Windows\CurrentVersion\DeliveryOptimization\Settings]
"DownloadMode"=dword:00000000

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,5 @@
Windows Registry Editor Version 5.00
; Turn Off "Get the latest updates as soon as they're available"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings]
"IsContinuousInnovationOptedIn"=dword:00000000

View File

@@ -0,0 +1,4 @@
Windows Registry Editor Version 5.00
[hkey_users\default\Control Panel\Desktop]
"WindowArrangementActive"="0"

View File

@@ -0,0 +1,4 @@
Windows Registry Editor Version 5.00
[hkey_users\default\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
"MultiTaskingAltTabFilter"=dword:00000003

View File

@@ -0,0 +1,5 @@
Windows Registry Editor Version 5.00
; Prevent automatic restarts after updates while signed in
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU]
"NoAutoRebootWithLoggedOnUsers"=dword:00000001

View File

@@ -0,0 +1,4 @@
Windows Registry Editor Version 5.00
[hkey_users\default\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
"MultiTaskingAltTabFilter"=dword:00000000

View File

@@ -0,0 +1,4 @@
Windows Registry Editor Version 5.00
[hkey_users\default\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
"MultiTaskingAltTabFilter"=dword:00000002

View File

@@ -0,0 +1,4 @@
Windows Registry Editor Version 5.00
[hkey_users\default\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
"MultiTaskingAltTabFilter"=dword:00000001

View File

@@ -0,0 +1,5 @@
Windows Registry Editor Version 5.00
; Allow automatic restarts after updates while signed in
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU]
"NoAutoRebootWithLoggedOnUsers"=-

View File

@@ -0,0 +1,4 @@
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\BitLocker]
"PreventDeviceEncryption"=-

View File

@@ -0,0 +1,5 @@
Windows Registry Editor Version 5.00
; Enable sharing downloaded updates with other PCs (Delivery Optimization)
[HKEY_USERS\S-1-5-20\Software\Microsoft\Windows\CurrentVersion\DeliveryOptimization\Settings]
"DownloadMode"=dword:00000001

View File

@@ -17,4 +17,4 @@ Windows Registry Editor Version 5.00
"URL Protocol"="" "URL Protocol"=""
"NoOpenWith"=- "NoOpenWith"=-
[-HKEY_CLASSES_ROOT\ms-gamebar\shell\open\command] [-HKEY_CLASSES_ROOT\ms-gamebarservices\shell\open\command]

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,5 @@
Windows Registry Editor Version 5.00
; Turn On "Get the latest updates as soon as they're available"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings]
"IsContinuousInnovationOptedIn"=dword:00000001

View File

@@ -0,0 +1,4 @@
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Control Panel\Desktop]
"WindowArrangementActive"="1"

View File

@@ -4,7 +4,10 @@ setlocal EnableDelayedExpansion
:: Set Windows Terminal installation paths. (Default and Scoop installation) :: Set Windows Terminal installation paths. (Default and Scoop installation)
set "wtDefaultPath=%LOCALAPPDATA%\Microsoft\WindowsApps\wt.exe" set "wtDefaultPath=%LOCALAPPDATA%\Microsoft\WindowsApps\wt.exe"
set "wtScoopPath=%USERPROFILE%\scoop\apps\windows-terminal\current\wt.exe" set "wtScoopPath=%USERPROFILE%\scoop\apps\windows-terminal\current\wt.exe"
set "logFile=%~dp0Win11Debloat.log" set "logFile=%~dp0Logs\Win11Debloat-Run.log"
:: Ensure Logs folder exists
if not exist "%~dp0Logs" mkdir "%~dp0Logs"
:: Determine which terminal exists :: Determine which terminal exists
if exist "%wtDefaultPath%" ( if exist "%wtDefaultPath%" (

253
Schemas/AboutWindow.xaml Normal file
View File

@@ -0,0 +1,253 @@
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="About Win11Debloat"
Width="500"
SizeToContent="Height"
ResizeMode="NoResize"
WindowStartupLocation="CenterScreen"
WindowStyle="None"
AllowsTransparency="True"
Background="Transparent"
Topmost="True"
ShowInTaskbar="False">
<Window.Resources>
<Style x:Key="HyperlinkStyle" TargetType="TextBlock">
<Setter Property="Foreground" Value="{DynamicResource ButtonBg}"/>
<Setter Property="Cursor" Value="Hand"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="{DynamicResource ButtonHover}"/>
</Trigger>
</Style.Triggers>
</Style>
<!-- Button Style -->
<Style x:Key="MessageBoxButton" TargetType="Button">
<Setter Property="Background" Value="{DynamicResource SecondaryButtonBg}"/>
<Setter Property="Foreground" Value="{DynamicResource FgColor}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="BorderBrush" Value="{DynamicResource ButtonBorderColor}"/>
<Setter Property="Padding" Value="0"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="Height" Value="32"/>
<Setter Property="MinWidth" Value="80"/>
<Setter Property="Margin" Value="4,0"/>
<Setter Property="FontWeight" Value="Normal"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border x:Name="Border"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="4"
Padding="{TemplateBinding Padding}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,0,0,1"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Border" Property="Background" Value="{DynamicResource SecondaryButtonHover}"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="Border" Property="Background" Value="{DynamicResource SecondaryButtonPressed}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- Primary Button Style -->
<Style x:Key="PrimaryMessageBoxButton" TargetType="Button" BasedOn="{StaticResource MessageBoxButton}">
<Setter Property="Background" Value="{DynamicResource ButtonBg}"/>
<Setter Property="Foreground" Value="white"/>
<Setter Property="BorderBrush" Value="{DynamicResource ButtonBg}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="4"
Padding="{TemplateBinding Padding}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,0,0,1"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Background" Value="{DynamicResource ButtonDisabled}"/>
<Setter Property="BorderBrush" Value="{DynamicResource ButtonDisabled}"/>
<Setter Property="Foreground" Value="{DynamicResource ButtonTextDisabled}"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{DynamicResource ButtonHover}"/>
<Setter Property="BorderBrush" Value="{DynamicResource ButtonHover}"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" Value="{DynamicResource ButtonPressed}"/>
<Setter Property="BorderBrush" Value="{DynamicResource ButtonPressed}"/>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Border BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1"
CornerRadius="8"
Background="{DynamicResource CardBgColor}"
Margin="25">
<Border.Effect>
<DropShadowEffect Color="Black"
Opacity="0.15"
BlurRadius="20"
ShadowDepth="0"
Direction="0"/>
</Border.Effect>
<Grid Margin="0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- Title Bar -->
<Grid Grid.Row="0" x:Name="TitleBar" Height="48" Background="Transparent">
<TextBlock Text="About Win11Debloat"
Foreground="{DynamicResource FgColor}"
FontSize="18"
FontWeight="SemiBold"
VerticalAlignment="Center"
Margin="20,0,0,0"/>
</Grid>
<!-- Message Content -->
<Grid Grid.Row="1">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- Message Text -->
<Grid Grid.Row="0" Margin="24,12,24,20">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- Version -->
<TextBlock Grid.Row="0" Grid.Column="0"
Text="Version:"
FontSize="14"
Foreground="{DynamicResource FgColor}"
FontWeight="SemiBold"
Margin="0,0,16,8"/>
<TextBlock x:Name="VersionText"
Grid.Row="0" Grid.Column="1"
Text="0.0.0"
FontSize="14"
Foreground="{DynamicResource FgColor}"
Margin="0,0,0,8"/>
<!-- Author -->
<TextBlock Grid.Row="1" Grid.Column="0"
Text="Author:"
FontSize="14"
Foreground="{DynamicResource FgColor}"
FontWeight="SemiBold"
Margin="0,0,16,8"/>
<TextBlock Grid.Row="1" Grid.Column="1"
Text="Raphire"
FontSize="14"
Foreground="{DynamicResource FgColor}"
Margin="0,0,0,8"/>
<!-- Project Link -->
<TextBlock Grid.Row="2" Grid.Column="0"
Text="Project:"
FontSize="14"
Foreground="{DynamicResource FgColor}"
FontWeight="SemiBold"
Margin="0,0,16,0"/>
<TextBlock x:Name="ProjectLink"
Grid.Row="2" Grid.Column="1"
Text="https://github.com/Raphire/Win11Debloat"
FontSize="14"
Style="{StaticResource HyperlinkStyle}"
Margin="0,0,0,0"/>
</Grid>
<!-- Separator -->
<Border Grid.Row="1"
Height="1"
Background="{DynamicResource BorderColor}"
Margin="10,0"/>
<!-- Content -->
<StackPanel Grid.Row="2" Margin="24,20">
<!-- Donation Message -->
<TextBlock Text="Win11Debloat is a passion project that I maintain in my free time. If you've found this tool useful, please consider making a small donation to support its development. I really appreciate it!"
FontSize="14"
Foreground="{DynamicResource FgColor}"
TextWrapping="Wrap"
Margin="0,0,0,15"/>
<!-- Ko-fi Link -->
<Grid HorizontalAlignment="Left">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock x:Name="KofiLinkIcon"
Grid.Column="0"
FontSize="16"
Style="{StaticResource HyperlinkStyle}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontWeight="SemiBold"
FontFamily="Segoe Fluent Icons"
Text="&#xEB52;"
Foreground="{DynamicResource CloseHover}"
Margin="0,0,8,0"/>
<TextBlock x:Name="KofiLink"
Grid.Column="1"
FontSize="16"
Style="{StaticResource HyperlinkStyle}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontWeight="SemiBold"
Text="Support me on Ko-fi"/>
</Grid>
</StackPanel>
</Grid>
<!-- Button Panel -->
<Border Grid.Row="2"
Background="{DynamicResource BgColor}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="0,1,0,0"
Padding="16,12"
CornerRadius="0,0,8,8">
<StackPanel x:Name="ButtonPanel"
Orientation="Horizontal"
HorizontalAlignment="Right">
<Button x:Name="CloseButton"
Content="Close"
Style="{StaticResource MessageBoxButton}"/>
</StackPanel>
</Border>
</Grid>
</Border>
</Window>

View File

@@ -205,7 +205,15 @@
<Border BorderBrush="{DynamicResource BorderColor}" <Border BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1" BorderThickness="1"
CornerRadius="8" CornerRadius="8"
Background="{DynamicResource BgColor}"> Background="{DynamicResource BgColor}"
Margin="25">
<Border.Effect>
<DropShadowEffect Color="Black"
Opacity="0.15"
BlurRadius="20"
ShadowDepth="0"
Direction="0"/>
</Border.Effect>
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="32"/> <RowDefinition Height="32"/>
@@ -227,7 +235,7 @@
Margin="12,0,0,0" Margin="12,0,0,0"
FontSize="12"/> FontSize="12"/>
<StackPanel Grid.Column="1" Orientation="Horizontal"> <StackPanel Grid.Column="1" Orientation="Horizontal">
<Button x:Name="CloseBtn" Content="&#xE8BB;" Style="{StaticResource CloseButton}" ToolTip="Close" IsCancel="True"/> <Button x:Name="CloseBtn" Content="&#xE8BB;" Style="{StaticResource CloseButton}" ToolTip="Close" IsCancel="True" AutomationProperties.Name="Close"/>
</StackPanel> </StackPanel>
</Grid> </Grid>
</Border> </Border>
@@ -250,7 +258,7 @@
Margin="0,0,0,10"/> Margin="0,0,0,10"/>
<StackPanel Grid.Row="1" Orientation="Horizontal" Margin="0,0,0,8"> <StackPanel Grid.Row="1" Orientation="Horizontal" Margin="0,0,0,8">
<CheckBox x:Name="CheckAllBox" Content="Check/Uncheck all" Margin="8,0,15,0" Foreground="{DynamicResource FgColor}"/> <CheckBox x:Name="CheckAllBox" Content="Check/Uncheck all" Margin="8,0,15,0" Foreground="{DynamicResource FgColor}" AutomationProperties.Name="Check or Uncheck all"/>
</StackPanel> </StackPanel>
<Border Grid.Row="2" BorderBrush="{DynamicResource BorderColor}" CornerRadius="4" BorderThickness="1" Margin="0,0,0,10" Background="{DynamicResource CardBgColor}"> <Border Grid.Row="2" BorderBrush="{DynamicResource BorderColor}" CornerRadius="4" BorderThickness="1" Margin="0,0,0,10" Background="{DynamicResource CardBgColor}">
@@ -266,13 +274,23 @@
<StackPanel Grid.Row="3" Orientation="Horizontal" HorizontalAlignment="Right"> <StackPanel Grid.Row="3" Orientation="Horizontal" HorizontalAlignment="Right">
<Grid Margin="0,8,10,10"> <Grid Margin="0,8,10,10">
<CheckBox x:Name="OnlyInstalledBox" Content="Only show installed apps" Foreground="{DynamicResource FgColor}" /> <CheckBox x:Name="OnlyInstalledBox" Content="Only show installed apps" Foreground="{DynamicResource FgColor}" AutomationProperties.Name="Only show installed apps"/>
</Grid> </Grid>
<Button x:Name="ConfirmBtn" Width="80" Height="32" Margin="0,0,10,0" Content="Confirm" Style="{StaticResource Win11Button}"/> <Button x:Name="ConfirmBtn" Width="80" Height="32" Margin="0,0,10,0" Content="Confirm" Style="{StaticResource Win11Button}" AutomationProperties.Name="Confirm"/>
<Button x:Name="CancelBtn" Width="80" Height="32" Content="Cancel" Style="{StaticResource Win11ButtonSecondary}" IsCancel="True"/> <Button x:Name="CancelBtn" Width="80" Height="32" Content="Cancel" Style="{StaticResource Win11ButtonSecondary}" IsCancel="True" AutomationProperties.Name="Cancel"/>
</StackPanel> </StackPanel>
</Grid> </Grid>
</Grid> </Grid>
<!-- Modal Overlay for MessageBoxes -->
<Rectangle x:Name="ModalOverlay"
Grid.RowSpan="2"
Fill="#80000000"
Visibility="Collapsed"
Panel.ZIndex="1000"
RadiusX="8"
RadiusY="8"
Margin="-1"/>
</Grid> </Grid>
</Border> </Border>
</Window> </Window>

View File

@@ -1,8 +1,9 @@
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Win11Debloat" Title="Win11Debloat"
Width="1024" Height="768" MinWidth="1024" MinHeight="600"
ResizeMode="NoResize" MaxWidth="1280"
ResizeMode="CanResize"
SnapsToDevicePixels="True" SnapsToDevicePixels="True"
WindowStartupLocation="CenterScreen" WindowStartupLocation="CenterScreen"
WindowStyle="None" WindowStyle="None"
@@ -53,7 +54,7 @@
<Setter Property="Foreground" Value="{DynamicResource FgColor}"/> <Setter Property="Foreground" Value="{DynamicResource FgColor}"/>
<Setter Property="BorderBrush" Value="{DynamicResource BorderColor}"/> <Setter Property="BorderBrush" Value="{DynamicResource BorderColor}"/>
<Setter Property="BorderThickness" Value="1"/> <Setter Property="BorderThickness" Value="1"/>
<Setter Property="Margin" Value="0,4,0,8"/> <Setter Property="Margin" Value="0,4,0,12"/>
<Setter Property="MinHeight" Value="33"/> <Setter Property="MinHeight" Value="33"/>
<Setter Property="Template"> <Setter Property="Template">
<Setter.Value> <Setter.Value>
@@ -70,7 +71,7 @@
<Border x:Name="Border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="4"> <Border x:Name="Border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="4">
<TextBlock x:Name="Arrow" <TextBlock x:Name="Arrow"
Text="&#xE70D;" Text="&#xE70D;"
FontFamily="Segoe MDL2 Assets" FontFamily="Segoe Fluent Icons"
FontSize="10" FontSize="10"
HorizontalAlignment="Right" HorizontalAlignment="Right"
VerticalAlignment="Center" VerticalAlignment="Center"
@@ -158,6 +159,13 @@
<Trigger Property="SelectedIndex" Value="-1"> <Trigger Property="SelectedIndex" Value="-1">
<Setter TargetName="ClosedAccentLine" Property="Visibility" Value="Collapsed"/> <Setter TargetName="ClosedAccentLine" Property="Visibility" Value="Collapsed"/>
</Trigger> </Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="ClosedAccentLine" Property="Visibility" Value="Collapsed"/>
<Setter Property="Background" Value="{DynamicResource ButtonDisabled}"/>
<Setter Property="BorderBrush" Value="{DynamicResource BorderColor}"/>
<Setter Property="Foreground" Value="{DynamicResource ButtonTextDisabled}"/>
<Setter Property="Opacity" Value="0.6"/>
</Trigger>
</ControlTemplate.Triggers> </ControlTemplate.Triggers>
</ControlTemplate> </ControlTemplate>
</Setter.Value> </Setter.Value>
@@ -212,7 +220,16 @@
<Style x:Key="LabelStyle" TargetType="TextBlock"> <Style x:Key="LabelStyle" TargetType="TextBlock">
<Setter Property="Foreground" Value="{DynamicResource FgColor}"/> <Setter Property="Foreground" Value="{DynamicResource FgColor}"/>
<Setter Property="FontSize" Value="12"/> <Setter Property="FontSize" Value="12"/>
<Setter Property="Margin" Value="0,0,0,3"/> <Setter Property="Margin" Value="0,0,0,2"/>
</Style>
<!-- Label Border Style for ComboBox labels -->
<Style x:Key="LabelBorderStyle" TargetType="Border">
<Setter Property="CornerRadius" Value="4"/>
<Setter Property="Padding" Value="6,2"/>
<Setter Property="Margin" Value="-4,-2,-4,0"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="HorizontalAlignment" Value="Stretch"/>
</Style> </Style>
<!-- Category card border style --> <!-- Category card border style -->
@@ -221,28 +238,82 @@
<Setter Property="BorderThickness" Value="1"/> <Setter Property="BorderThickness" Value="1"/>
<Setter Property="CornerRadius" Value="4"/> <Setter Property="CornerRadius" Value="4"/>
<Setter Property="Background" Value="{DynamicResource CardBgColor}"/> <Setter Property="Background" Value="{DynamicResource CardBgColor}"/>
<Setter Property="Padding" Value="16,12"/> <Setter Property="Padding" Value="16,12,16,2"/>
<Setter Property="Margin" Value="0,0,0,16"/> <Setter Property="Margin" Value="0,0,0,16"/>
</Style> </Style>
<!-- Category header text style --> <!-- Category header text style -->
<Style x:Key="CategoryHeaderTextBlock" TargetType="TextBlock"> <Style x:Key="CategoryHeaderTextBlock" TargetType="TextBlock">
<Setter Property="FontWeight" Value="Bold"/> <Setter Property="FontWeight" Value="Bold"/>
<Setter Property="FontSize" Value="15"/> <Setter Property="FontSize" Value="16"/>
<Setter Property="Margin" Value="0,0,0,10"/> <Setter Property="Margin" Value="0,0,0,13"/>
<Setter Property="Foreground" Value="{DynamicResource FgColor}"/> <Setter Property="Foreground" Value="{DynamicResource FgColor}"/>
</Style> </Style>
<!-- Category header icon style -->
<Style x:Key="CategoryHeaderIcon" TargetType="TextBlock">
<Setter Property="FontFamily" Value="Segoe Fluent Icons"/>
<Setter Property="FontSize" Value="19"/>
<Setter Property="Foreground" Value="{DynamicResource FgColor}"/>
<Setter Property="Margin" Value="0,0,8,12"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
<!-- Category help link button/text styles -->
<Style x:Key="CategoryHelpLinkButtonStyle" TargetType="Button">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Padding" Value="0"/>
<Setter Property="Margin" Value="6,1,0,13"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Focusable" Value="False"/>
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
<Setter Property="Foreground" Value="{DynamicResource ButtonBg}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Background="Transparent" BorderBrush="Transparent" BorderThickness="0">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="{DynamicResource ButtonHover}"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Foreground" Value="{DynamicResource ButtonPressed}"/>
</Trigger>
</Style.Triggers>
</Style>
<Style x:Key="CategoryHelpLinkTextStyle" TargetType="TextBlock">
<Setter Property="FontSize" Value="12"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Foreground">
<Setter.Value>
<Binding RelativeSource="{RelativeSource AncestorType=Button}" Path="Foreground"/>
</Setter.Value>
</Setter>
</Style>
<!-- Overview changes text style --> <!-- Overview changes text style -->
<Style x:Key="OverviewNoChangesTextStyle" TargetType="TextBlock"> <Style x:Key="OverviewNoChangesTextStyle" TargetType="TextBlock">
<Setter Property="Foreground" Value="{DynamicResource FgColor}"/> <Setter Property="Foreground" Value="{DynamicResource FgColor}"/>
<Setter Property="FontStyle" Value="Italic"/>
<Setter Property="Margin" Value="0,0,0,8"/> <Setter Property="Margin" Value="0,0,0,8"/>
<Setter Property="FontSize" Value="12"/>
<Setter Property="FontStyle" Value="Italic"/>
</Style> </Style>
<Style x:Key="OverviewChangeBulletStyle" TargetType="TextBlock"> <Style x:Key="OverviewChangeBulletStyle" TargetType="TextBlock">
<Setter Property="Foreground" Value="{DynamicResource FgColor}"/> <Setter Property="Foreground" Value="{DynamicResource FgColor}"/>
<Setter Property="Margin" Value="0,0,0,8"/> <Setter Property="Margin" Value="0,0,0,8"/>
<Setter Property="FontSize" Value="12"/>
<Setter Property="TextWrapping" Value="Wrap"/> <Setter Property="TextWrapping" Value="Wrap"/>
</Style> </Style>
@@ -251,6 +322,44 @@
<Setter Property="CaretBrush" Value="{DynamicResource FgColor}"/> <Setter Property="CaretBrush" Value="{DynamicResource FgColor}"/>
</Style> </Style>
<!-- User TextBox Style with disabled state -->
<Style x:Key="UserTextBoxStyle" TargetType="TextBox">
<Setter Property="CaretBrush" Value="{DynamicResource FgColor}"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Foreground" Value="{DynamicResource FgColor}"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="FontSize" Value="13"/>
<Setter Property="Margin" Value="1,0,0,1"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Padding" Value="0"/>
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Background" Value="{DynamicResource ButtonDisabled}"/>
<Setter Property="Foreground" Value="{DynamicResource ButtonTextDisabled}"/>
<Setter Property="Opacity" Value="0.6"/>
</Trigger>
</Style.Triggers>
</Style>
<!-- User TextBox Border Style with disabled state -->
<Style x:Key="UserTextBoxBorderStyle" TargetType="Border">
<Setter Property="Background" Value="{DynamicResource ComboBgColor}"/>
<Setter Property="BorderBrush" Value="{DynamicResource ButtonBorderColor}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="CornerRadius" Value="4"/>
<Setter Property="Padding" Value="8,6"/>
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Background" Value="{DynamicResource ButtonDisabled}"/>
<Setter Property="BorderBrush" Value="{DynamicResource BorderColor}"/>
<Setter Property="Opacity" Value="0.6"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{DynamicResource ComboHoverColor}"/>
</Trigger>
</Style.Triggers>
</Style>
<!-- CheckBox Style --> <!-- CheckBox Style -->
<Style TargetType="CheckBox"> <Style TargetType="CheckBox">
<Setter Property="Foreground" Value="{DynamicResource FgColor}"/> <Setter Property="Foreground" Value="{DynamicResource FgColor}"/>
@@ -266,9 +375,9 @@
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Border x:Name="CheckBoxBorder" Grid.Column="0" Width="18" Height="18" Background="{DynamicResource CheckBoxBgColor}" BorderBrush="{DynamicResource CheckBoxBorderColor}" BorderThickness="1" CornerRadius="4" Margin="0,0,8,0"> <Border x:Name="CheckBoxBorder" Grid.Column="0" Width="18" Height="18" Background="{DynamicResource CheckBoxBgColor}" BorderBrush="{DynamicResource CheckBoxBorderColor}" BorderThickness="1" CornerRadius="4" Margin="0,0,8,0">
<TextBlock x:Name="CheckMark" Text="&#xE73E;" FontFamily="Segoe MDL2 Assets" FontSize="12" Foreground="{DynamicResource ButtonBg}" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Collapsed"/> <TextBlock x:Name="CheckMark" Text="&#xE73E;" FontFamily="Segoe Fluent Icons" FontSize="12" Foreground="{DynamicResource ButtonBg}" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Collapsed"/>
</Border> </Border>
<ContentPresenter Grid.Column="1" VerticalAlignment="Center" Margin="0,0,0,1"/> <ContentPresenter Grid.Column="1" VerticalAlignment="Center" Margin="0,0,0,2"/>
</Grid> </Grid>
</Border> </Border>
<ControlTemplate.Triggers> <ControlTemplate.Triggers>
@@ -281,6 +390,13 @@
<Setter TargetName="CheckBoxBorder" Property="BorderBrush" Value="{DynamicResource ButtonBg}"/> <Setter TargetName="CheckBoxBorder" Property="BorderBrush" Value="{DynamicResource ButtonBg}"/>
<Setter TargetName="CheckMark" Property="Foreground" Value="White"/> <Setter TargetName="CheckMark" Property="Foreground" Value="White"/>
</Trigger> </Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="CheckBoxBorder" Property="Background" Value="{DynamicResource ButtonDisabled}"/>
<Setter TargetName="CheckBoxBorder" Property="BorderBrush" Value="{DynamicResource BorderColor}"/>
<Setter Property="Foreground" Value="{DynamicResource ButtonTextDisabled}"/>
<Setter Property="Opacity" Value="0.6"/>
<Setter TargetName="CheckMark" Property="Foreground" Value="{DynamicResource ButtonTextDisabled}"/>
</Trigger>
<MultiTrigger> <MultiTrigger>
<MultiTrigger.Conditions> <MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True"/> <Condition Property="IsMouseOver" Value="True"/>
@@ -297,8 +413,8 @@
<!-- CheckBox style for feature toggles --> <!-- CheckBox style for feature toggles -->
<Style x:Key="FeatureCheckboxStyle" TargetType="CheckBox" BasedOn="{StaticResource {x:Type CheckBox}}"> <Style x:Key="FeatureCheckboxStyle" TargetType="CheckBox" BasedOn="{StaticResource {x:Type CheckBox}}">
<Setter Property="Margin" Value="0,0,0,10"/> <Setter Property="Margin" Value="-4,-2,-4,10"/>
<Setter Property="Padding" Value="0,2"/> <Setter Property="Padding" Value="4,2"/>
</Style> </Style>
<!-- CheckBox style for apps panels --> <!-- CheckBox style for apps panels -->
@@ -307,7 +423,7 @@
</Style> </Style>
<!-- Button Style --> <!-- Button Style -->
<Style x:Key="Win11Button" TargetType="Button"> <Style x:Key="PrimaryButtonStyle" TargetType="Button">
<Setter Property="Background" Value="{DynamicResource ButtonBg}"/> <Setter Property="Background" Value="{DynamicResource ButtonBg}"/>
<Setter Property="Foreground" Value="white"/> <Setter Property="Foreground" Value="white"/>
<Setter Property="BorderBrush" Value="{DynamicResource ButtonBg}"/> <Setter Property="BorderBrush" Value="{DynamicResource ButtonBg}"/>
@@ -346,7 +462,7 @@
</Style> </Style>
<!-- Secondary Button Style --> <!-- Secondary Button Style -->
<Style x:Key="Win11ButtonSecondary" TargetType="Button"> <Style x:Key="SecondaryButtonStyle" TargetType="Button">
<Setter Property="Background" Value="{DynamicResource SecondaryButtonBg}"/> <Setter Property="Background" Value="{DynamicResource SecondaryButtonBg}"/>
<Setter Property="Foreground" Value="{DynamicResource FgColor}"/> <Setter Property="Foreground" Value="{DynamicResource FgColor}"/>
<Setter Property="BorderBrush" Value="{DynamicResource ButtonBorderColor}"/> <Setter Property="BorderBrush" Value="{DynamicResource ButtonBorderColor}"/>
@@ -391,7 +507,7 @@
<Setter Property="BorderThickness" Value="0"/> <Setter Property="BorderThickness" Value="0"/>
<Setter Property="Width" Value="46"/> <Setter Property="Width" Value="46"/>
<Setter Property="Height" Value="32"/> <Setter Property="Height" Value="32"/>
<Setter Property="FontFamily" Value="Segoe MDL2 Assets"/> <Setter Property="FontFamily" Value="Segoe Fluent Icons"/>
<Setter Property="FontSize" Value="10"/> <Setter Property="FontSize" Value="10"/>
<Setter Property="Template"> <Setter Property="Template">
<Setter.Value> <Setter.Value>
@@ -410,31 +526,115 @@
</Trigger> </Trigger>
</Style.Triggers> </Style.Triggers>
</Style> </Style>
<Style x:Key="HelpButton" TargetType="Button" BasedOn="{StaticResource TitleBarButton}"> <Style x:Key="TitlebarButton" TargetType="Button" BasedOn="{StaticResource TitleBarButton}">
<Setter Property="Template"> <Setter Property="Template">
<Setter.Value> <Setter.Value>
<ControlTemplate TargetType="Button"> <ControlTemplate TargetType="Button">
<Border Background="{TemplateBinding Background}" BorderThickness="0" CornerRadius="0"> <Border Background="{TemplateBinding Background}" BorderThickness="0" CornerRadius="0">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,0,0,3"/> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border> </Border>
</ControlTemplate> </ControlTemplate>
</Setter.Value> </Setter.Value>
</Setter> </Setter>
<Style.Triggers> <Style.Triggers>
<Trigger Property="IsMouseOver" Value="True"> <Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{DynamicResource ButtonBg}"/> <Setter Property="Background" Value="{DynamicResource SecondaryButtonHover}"/>
</Trigger> </Trigger>
<Trigger Property="IsPressed" Value="True"> <Trigger Property="IsPressed" Value="True">
<Setter Property="Background" Value="{DynamicResource ButtonHover}"/> <Setter Property="Background" Value="{DynamicResource SecondaryButtonPressed}"/>
</Trigger> </Trigger>
</Style.Triggers> </Style.Triggers>
</Style> </Style>
<!-- SearchBox Border Style -->
<Style x:Key="SearchBoxBorderStyle" TargetType="Border">
<Setter Property="Background" Value="{DynamicResource ComboBgColor}"/>
<Setter Property="BorderBrush" Value="{DynamicResource ButtonBorderColor}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="CornerRadius" Value="4"/>
<Setter Property="Width" Value="300"/>
<Setter Property="Padding" Value="8,6"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{DynamicResource ComboHoverColor}"/>
</Trigger>
</Style.Triggers>
</Style>
<!-- ContextMenu Style -->
<Style TargetType="ContextMenu">
<Setter Property="Background" Value="{DynamicResource CardBgColor}"/>
<Setter Property="BorderBrush" Value="{DynamicResource BorderColor}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Padding" Value="4"/>
<Setter Property="HasDropShadow" Value="True"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ContextMenu">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="4"
Padding="{TemplateBinding Padding}">
<StackPanel IsItemsHost="True"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- MenuItem Style -->
<Style TargetType="MenuItem">
<Setter Property="Foreground" Value="{DynamicResource FgColor}"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Padding" Value="8,6"/>
<Setter Property="Height" Value="32"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="MenuItem">
<Border Background="{TemplateBinding Background}"
BorderThickness="0"
CornerRadius="4"
Padding="{TemplateBinding Padding}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="24"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ContentPresenter Grid.Column="0" ContentSource="Icon"
VerticalAlignment="Center"
HorizontalAlignment="Center"/>
<ContentPresenter Grid.Column="1" ContentSource="Header"
VerticalAlignment="Center"
Margin="8,0,0,1"/>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsHighlighted" Value="True">
<Setter Property="Background" Value="{DynamicResource ComboItemHoverColor}"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" Value="{DynamicResource ComboItemSelectedColor}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources> </Window.Resources>
<Border BorderBrush="{DynamicResource BorderColor}" <Border BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1" BorderThickness="1"
CornerRadius="8" CornerRadius="8"
Background="{DynamicResource BgColor}"> Background="{DynamicResource BgColor}"
Margin="25">
<Border.Effect>
<DropShadowEffect Color="Black"
Opacity="0.15"
BlurRadius="20"
ShadowDepth="0"
Direction="0"/>
</Border.Effect>
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="32"/> <RowDefinition Height="32"/>
@@ -442,6 +642,16 @@
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<!-- Resize Borders -->
<Rectangle x:Name="ResizeLeft" Width="5" HorizontalAlignment="Left" Fill="Transparent" Cursor="SizeWE" Grid.Row="0" Grid.RowSpan="3" Panel.ZIndex="100"/>
<Rectangle x:Name="ResizeRight" Width="5" HorizontalAlignment="Right" Fill="Transparent" Cursor="SizeWE" Grid.Row="0" Grid.RowSpan="3" Panel.ZIndex="100"/>
<Rectangle x:Name="ResizeTop" Height="5" VerticalAlignment="Top" Fill="Transparent" Cursor="SizeNS" Grid.Row="0" Panel.ZIndex="100"/>
<Rectangle x:Name="ResizeBottom" Height="5" VerticalAlignment="Bottom" Fill="Transparent" Cursor="SizeNS" Grid.Row="2" Panel.ZIndex="100"/>
<Rectangle x:Name="ResizeTopLeft" Width="8" Height="8" HorizontalAlignment="Left" VerticalAlignment="Top" Fill="Transparent" Cursor="SizeNWSE" Grid.Row="0" Panel.ZIndex="101"/>
<Rectangle x:Name="ResizeTopRight" Width="8" Height="8" HorizontalAlignment="Right" VerticalAlignment="Top" Fill="Transparent" Cursor="SizeNESW" Grid.Row="0" Panel.ZIndex="101"/>
<Rectangle x:Name="ResizeBottomLeft" Width="8" Height="8" HorizontalAlignment="Left" VerticalAlignment="Bottom" Fill="Transparent" Cursor="SizeNESW" Grid.Row="2" Panel.ZIndex="101"/>
<Rectangle x:Name="ResizeBottomRight" Width="8" Height="8" HorizontalAlignment="Right" VerticalAlignment="Bottom" Fill="Transparent" Cursor="SizeNWSE" Grid.Row="2" Panel.ZIndex="101"/>
<!-- Custom Title Bar --> <!-- Custom Title Bar -->
<Grid Grid.Row="0" x:Name="TitleBar"> <Grid Grid.Row="0" x:Name="TitleBar">
<Border Background="{DynamicResource BgColor}" CornerRadius="8,8,0,0"> <Border Background="{DynamicResource BgColor}" CornerRadius="8,8,0,0">
@@ -457,8 +667,34 @@
Margin="12,0,0,0" Margin="12,0,0,0"
FontSize="12"/> FontSize="12"/>
<StackPanel Grid.Column="1" Orientation="Horizontal"> <StackPanel Grid.Column="1" Orientation="Horizontal">
<Button x:Name="HelpBtn" Content="?" FontFamily="Segoe UI" FontSize="15" Style="{StaticResource HelpButton}" ToolTip="Open Wiki"/> <Button x:Name="KofiBtn" Content="&#xEB52;" FontFamily="Segoe Fluent Icons" FontSize="15" Style="{StaticResource TitlebarButton}" ToolTip="Support the creator" AutomationProperties.Name="Support the creator"/>
<Button x:Name="CloseBtn" Content="&#xE8BB;" Style="{StaticResource CloseButton}" ToolTip="Close"/> <Button x:Name="MenuBtn" Content="&#xE700;" FontFamily="Segoe Fluent Icons" FontSize="15" Style="{StaticResource TitlebarButton}" ToolTip="Options" AutomationProperties.Name="Options">
<Button.ContextMenu>
<ContextMenu x:Name="MainMenu">
<MenuItem x:Name="MenuDocumentation" Header="Documentation" AutomationProperties.Name="Documentation">
<MenuItem.Icon>
<TextBlock Text="&#xe736;" FontFamily="Segoe MDL2 Assets" FontSize="16" Foreground="{DynamicResource FgColor}"/>
</MenuItem.Icon>
</MenuItem>
<MenuItem x:Name="MenuReportBug" Header="Report a bug" AutomationProperties.Name="Report a bug">
<MenuItem.Icon>
<TextBlock Text="&#xEBE8;" FontFamily="Segoe Fluent Icons" FontSize="16" Foreground="{DynamicResource FgColor}"/>
</MenuItem.Icon>
</MenuItem>
<MenuItem x:Name="MenuLogs" Header="Logs" AutomationProperties.Name="Logs">
<MenuItem.Icon>
<TextBlock Text="&#xf0e3;" FontFamily="Segoe Fluent Icons" FontSize="16" Foreground="{DynamicResource FgColor}"/>
</MenuItem.Icon>
</MenuItem>
<MenuItem x:Name="MenuAbout" Header="About" AutomationProperties.Name="About">
<MenuItem.Icon>
<TextBlock Text="&#xE946;" FontFamily="Segoe Fluent Icons" FontSize="16" Foreground="{DynamicResource FgColor}"/>
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
</Button.ContextMenu>
</Button>
<Button x:Name="CloseBtn" Content="&#xE8BB;" Style="{StaticResource CloseButton}" ToolTip="Close" AutomationProperties.Name="Close"/>
</StackPanel> </StackPanel>
</Grid> </Grid>
</Border> </Border>
@@ -525,10 +761,9 @@
</TextBlock> </TextBlock>
<!-- Start Button --> <!-- Start Button -->
<Button x:Name="HomeStartBtn" Width="200" Height="48" Style="{StaticResource Win11Button}" HorizontalAlignment="Center" Margin="0,50,0,0"> <Button x:Name="HomeStartBtn" Width="125" Height="53" Style="{StaticResource PrimaryButtonStyle}" HorizontalAlignment="Center" Margin="0,20,0,0" AutomationProperties.Name="Start">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center"> <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="Start" VerticalAlignment="Center" FontSize="20" Margin="0,0,0,2"/> <TextBlock Text="Start" FontWeight="SemiBold" VerticalAlignment="Center" FontSize="24" Margin="0,0,0,3"/>
<TextBlock Text="&#xE72A;" FontFamily="Segoe MDL2 Assets" FontSize="16" Margin="8,0,0,0" VerticalAlignment="Center"/>
</StackPanel> </StackPanel>
</Button> </Button>
</StackPanel> </StackPanel>
@@ -549,36 +784,49 @@
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/> <ColumnDefinition Width="10"/>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal" Grid.Column="0"> <StackPanel Orientation="Horizontal" Grid.Column="0">
<Button x:Name="DefaultAppsBtn" Content="Select Default Apps" ToolTip="Select the default selection of apps" Style="{StaticResource Win11ButtonSecondary}" Height="32" Padding="10,0" Margin="0,0,10,0"/> <Button x:Name="DefaultAppsBtn" Content="Select Default Apps" ToolTip="Select the default selection of apps" Style="{StaticResource SecondaryButtonStyle}" Height="32" Padding="10,0" Margin="0,0,10,0" AutomationProperties.Name="Select Default Apps"/>
<Button x:Name="LoadLastUsedAppsBtn" Content="Select Last Used Selection" ToolTip="Select the apps that were selected the last time Win11Debloat was run" Style="{StaticResource Win11ButtonSecondary}" Height="32" Padding="10,0" Margin="0,0,10,0"/> <Button x:Name="LoadLastUsedAppsBtn" Content="Select Last Used Selection" ToolTip="Select the apps that were selected the last time Win11Debloat was run" Style="{StaticResource SecondaryButtonStyle}" Height="32" Padding="10,0" Margin="0,0,10,0" AutomationProperties.Name="Select Last Used Selection"/>
<Button x:Name="ClearAppSelectionBtn" Content="Clear Selection" ToolTip="Clear all selected apps" Style="{StaticResource Win11ButtonSecondary}" Height="32" Padding="10,0" Margin="0,0,10,0"/> <Button x:Name="ClearAppSelectionBtn" Content="Clear Selection" ToolTip="Clear all selected apps" Style="{StaticResource SecondaryButtonStyle}" Height="32" Padding="10,0" Margin="0,0,10,0" AutomationProperties.Name="Clear Selection"/>
</StackPanel> </StackPanel>
<CheckBox x:Name="OnlyInstalledAppsBox" Grid.Column="2" Content="Only show installed apps" IsChecked="False" Foreground="{DynamicResource FgColor}" VerticalAlignment="Center"/> <CheckBox x:Name="OnlyInstalledAppsBox" Grid.Column="2" Content="Only show installed apps" IsChecked="False" Foreground="{DynamicResource FgColor}" VerticalAlignment="Center" AutomationProperties.Name="Only show installed apps"/>
<Border Grid.Column="4" BorderBrush="{DynamicResource ButtonBorderColor}" BorderThickness="1" CornerRadius="4" Background="{DynamicResource ComboBgColor}" Width="300" Padding="8,6"> <Border x:Name="AppSearchBorder" Grid.Column="4">
<Border.Style>
<Style TargetType="Border" BasedOn="{StaticResource SearchBoxBorderStyle}">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=AppSearchBox, Path=IsFocused}" Value="True">
<Setter Property="Background" Value="{DynamicResource InputFocusColor}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="&#xE721;" FontFamily="Segoe MDL2 Assets" FontSize="14" VerticalAlignment="Center" Margin="4,0,8,0" Foreground="{DynamicResource FgColor}"/> <TextBlock Grid.Column="0" Text="&#xE721;" FontFamily="Segoe Fluent Icons" FontSize="14" VerticalAlignment="Center" Margin="4,0,8,0" Foreground="{DynamicResource FgColor}"/>
<TextBlock x:Name="AppSearchPlaceholder" Grid.Column="1" Text="Search app" Foreground="{DynamicResource FgColor}" Opacity="0.5" FontSize="13" Margin="3,0,0,1" VerticalAlignment="Center" IsHitTestVisible="False"/> <TextBlock x:Name="AppSearchPlaceholder" Grid.Column="1" Text="Search app" Foreground="{DynamicResource FgColor}" Opacity="0.5" FontSize="13" Margin="3,0,0,1" VerticalAlignment="Center" IsHitTestVisible="False"/>
<TextBox x:Name="AppSearchBox" Grid.Column="1" Background="Transparent" Foreground="{DynamicResource FgColor}" BorderThickness="0" FontSize="13" Margin="1,0,0,1" VerticalAlignment="Center" Text=""/> <TextBox x:Name="AppSearchBox" Grid.Column="1" Background="Transparent" Foreground="{DynamicResource FgColor}" BorderThickness="0" FontSize="13" Margin="1,0,0,1" VerticalAlignment="Center" Text="" AutomationProperties.Name="Search app"/>
</Grid> </Grid>
</Border> </Border>
</Grid> </Grid>
</StackPanel> </StackPanel>
</Border> </Border>
<ScrollViewer VerticalScrollBarVisibility="Auto" Padding="20,0"> <Grid>
<StackPanel> <Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- Apps List --> <!-- Apps List -->
<Border BorderBrush="{DynamicResource BorderColor}" CornerRadius="4" BorderThickness="1" Margin="0,0,0,10" Background="{DynamicResource CardBgColor}" Height="510"> <Border Grid.Row="0" BorderBrush="{DynamicResource BorderColor}" CornerRadius="4" BorderThickness="1" Margin="20,0,20,10" Background="{DynamicResource CardBgColor}">
<Grid> <Grid>
<ScrollViewer VerticalScrollBarVisibility="Auto"> <ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel x:Name="AppSelectionPanel" Margin="8"/> <StackPanel x:Name="AppSelectionPanel" Margin="8"/>
@@ -590,11 +838,10 @@
</Border> </Border>
<!-- Status Info --> <!-- Status Info -->
<StackPanel Orientation="Horizontal"> <StackPanel Grid.Row="1" Orientation="Horizontal" Margin="20,0,20,0">
<TextBlock x:Name="AppSelectionStatus" Text="" Foreground="{DynamicResource FgColor}" Margin="10,0,0,0" HorizontalAlignment="Left"/> <TextBlock x:Name="AppSelectionStatus" Text="" Foreground="{DynamicResource FgColor}" Margin="10,0,0,5" HorizontalAlignment="Left"/>
</StackPanel> </StackPanel>
</StackPanel> </Grid>
</ScrollViewer>
</DockPanel> </DockPanel>
</TabItem> </TabItem>
@@ -608,17 +855,44 @@
<!-- Filter Options --> <!-- Filter Options -->
<Grid Margin="0,0,0,12"> <Grid Margin="0,0,0,12">
<StackPanel Orientation="Horizontal"> <Grid.ColumnDefinitions>
<Button x:Name="LoadDefaultsBtn" Content="Select Default Settings" ToolTip="Select the settings that are recommended for most people" Style="{StaticResource Win11ButtonSecondary}" Padding="10,0" Height="32" Margin="0,0,10,0"/> <ColumnDefinition Width="Auto"/>
<Button x:Name="LoadLastUsedBtn" Content="Select Last Used Settings" ToolTip="Select the settings that were used the last time Win11Debloat was run" Style="{StaticResource Win11ButtonSecondary}" Padding="10,0" Height="32" Margin="0,0,10,0"/> <ColumnDefinition Width="*"/>
<Button x:Name="ClearAllTweaksBtn" Content="Clear Selection" ToolTip="Clear all selected tweaks" Style="{StaticResource Win11ButtonSecondary}" Padding="10,0" Height="32" Margin="0,0,10,0"/> <ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Orientation="Horizontal">
<Button x:Name="LoadDefaultsBtn" Content="Select Default Settings" ToolTip="Select the settings that are recommended for most people" Style="{StaticResource SecondaryButtonStyle}" Padding="10,0" Height="32" Margin="0,0,10,0" AutomationProperties.Name="Select Default Settings"/>
<Button x:Name="LoadLastUsedBtn" Content="Select Last Used Settings" ToolTip="Select the settings that were used the last time Win11Debloat was run" Style="{StaticResource SecondaryButtonStyle}" Padding="10,0" Height="32" Margin="0,0,10,0" AutomationProperties.Name="Select Last Used Settings"/>
<Button x:Name="ClearAllTweaksBtn" Content="Clear Selection" ToolTip="Clear all selected tweaks" Style="{StaticResource SecondaryButtonStyle}" Padding="10,0" Height="32" Margin="0,0,10,0" AutomationProperties.Name="Clear Selection"/>
</StackPanel> </StackPanel>
<Border x:Name="TweakSearchBorder" Grid.Column="2">
<Border.Style>
<Style TargetType="Border" BasedOn="{StaticResource SearchBoxBorderStyle}">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=TweakSearchBox, Path=IsFocused}" Value="True">
<Setter Property="Background" Value="{DynamicResource InputFocusColor}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="&#xE721;" FontFamily="Segoe Fluent Icons" FontSize="14" VerticalAlignment="Center" Margin="4,0,8,0" Foreground="{DynamicResource FgColor}"/>
<TextBlock x:Name="TweakSearchPlaceholder" Grid.Column="1" Text="Search setting" Foreground="{DynamicResource FgColor}" Opacity="0.5" FontSize="13" Margin="3,0,0,1" VerticalAlignment="Center" IsHitTestVisible="False"/>
<TextBox x:Name="TweakSearchBox" Grid.Column="1" Background="Transparent" Foreground="{DynamicResource FgColor}" BorderThickness="0" FontSize="13" Margin="1,0,0,1" VerticalAlignment="Center" Text=""/>
</Grid>
</Border>
</Grid> </Grid>
</StackPanel> </StackPanel>
</Border> </Border>
<Grid> <Grid>
<ScrollViewer VerticalScrollBarVisibility="Auto" Margin="0,-20,0,0" Padding="20,10,20,0"> <ScrollViewer x:Name="TweaksScrollViewer" VerticalScrollBarVisibility="Auto" Margin="0,-20,0,0" Padding="20,10,20,0">
<Grid Margin="0,10,0,5"> <Grid x:Name="TweaksGrid" Margin="0,10,0,5">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
@@ -670,55 +944,86 @@
<Grid> <Grid>
<ScrollViewer VerticalScrollBarVisibility="Auto" Margin="0,-20,0,0" Padding="20,10,20,0"> <ScrollViewer VerticalScrollBarVisibility="Auto" Margin="0,-20,0,0" Padding="20,10,20,0">
<StackPanel Margin="0,10,0,5"> <StackPanel Margin="0,10,0,5">
<!-- Apply Changes To --> <!-- Selected Changes -->
<Border BorderBrush="{DynamicResource BorderColor}" BorderThickness="1" CornerRadius="4" Background="{DynamicResource CardBgColor}" Padding="20" Margin="0,0,0,16"> <Border BorderBrush="{DynamicResource BorderColor}" BorderThickness="1" CornerRadius="4" Background="{DynamicResource CardBgColor}" Padding="16,12,16,4" Margin="0,0,0,16">
<StackPanel> <StackPanel>
<TextBlock Text="Apply Changes To" FontWeight="Bold" FontSize="14" Foreground="{DynamicResource FgColor}" Margin="0,0,0,8"/> <TextBlock Text="Selected Changes" Style="{StaticResource CategoryHeaderTextBlock}"/>
<ComboBox x:Name="UserSelectionCombo" Margin="0,0,0,12"> <StackPanel x:Name="OverviewChangesPanel"/>
<StackPanel Margin="0,0,0,3"/>
</StackPanel>
</Border>
<!-- Apply Changes To -->
<Border BorderBrush="{DynamicResource BorderColor}" BorderThickness="1" CornerRadius="4" Background="{DynamicResource CardBgColor}" Padding="16,12" Margin="0,0,0,16">
<StackPanel>
<TextBlock Text="Apply Changes To" Style="{StaticResource CategoryHeaderTextBlock}"/>
<ComboBox x:Name="UserSelectionCombo" Margin="0,0,0,6" AutomationProperties.Name="Apply Changes To">
<ComboBoxItem Content="Current User" IsSelected="True"/> <ComboBoxItem Content="Current User" IsSelected="True"/>
<ComboBoxItem Content="Other User"/> <ComboBoxItem Content="Other User"/>
<ComboBoxItem Content="Windows Default User (Sysprep)"/> <ComboBoxItem Content="Windows Default User (Sysprep)"/>
</ComboBox> </ComboBox>
<StackPanel x:Name="OtherUserPanel" Visibility="Collapsed" Margin="0,0,0,12"> <StackPanel x:Name="OtherUserPanel" Visibility="Collapsed" Margin="0,0,0,6">
<TextBlock x:Name="UsernameValidationMessage" Text="" FontStyle="Italic" Foreground="{DynamicResource CloseHover}" FontSize="11" Margin="3,0,0,4" TextWrapping="Wrap"/> <TextBlock x:Name="UsernameValidationMessage" Text="" FontStyle="Italic" Foreground="{DynamicResource CloseHover}" FontSize="11" Margin="3,0,0,4" TextWrapping="Wrap"/>
<Border BorderBrush="{DynamicResource ButtonBorderColor}" BorderThickness="1" CornerRadius="4" Background="{DynamicResource ComboBgColor}" Padding="8,6"> <Border IsEnabled="{Binding ElementName=OtherUsernameTextBox, Path=IsEnabled}">
<Border.Style>
<Style TargetType="Border" BasedOn="{StaticResource UserTextBoxBorderStyle}">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=OtherUsernameTextBox, Path=IsFocused}" Value="True">
<Setter Property="Background" Value="{DynamicResource InputFocusColor}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="&#xE77B;" FontFamily="Segoe MDL2 Assets" FontSize="14" VerticalAlignment="Center" Margin="4,0,8,0" Foreground="{DynamicResource FgColor}"/> <TextBlock Grid.Column="0" Text="&#xE77B;" FontFamily="Segoe Fluent Icons" FontSize="14" VerticalAlignment="Center" Margin="4,0,8,0" Foreground="{DynamicResource FgColor}"/>
<TextBlock x:Name="UsernameTextBoxPlaceholder" Grid.Column="1" Text="Enter username" Foreground="{DynamicResource FgColor}" Opacity="0.5" FontSize="13" Margin="3,0,0,1" VerticalAlignment="Center" IsHitTestVisible="False"/> <TextBlock x:Name="UsernameTextBoxPlaceholder" Grid.Column="1" Text="Enter username" Foreground="{DynamicResource FgColor}" Opacity="0.5" FontSize="13" Margin="3,0,0,1" VerticalAlignment="Center" IsHitTestVisible="False"/>
<TextBox x:Name="OtherUsernameTextBox" Grid.Column="1" Background="Transparent" Foreground="{DynamicResource FgColor}" BorderThickness="0" FontSize="13" Margin="1,0,0,1" VerticalAlignment="Center" Text="" Padding="0"/> <TextBox x:Name="OtherUsernameTextBox" Grid.Column="1" Style="{StaticResource UserTextBoxStyle}" Text="" AutomationProperties.Name="Enter username"/>
</Grid> </Grid>
</Border> </Border>
</StackPanel> </StackPanel>
<TextBlock x:Name="UserSelectionDescription" Text="Changes will be applied to the currently logged-in user profile." Foreground="{DynamicResource FgColor}" FontSize="12" TextWrapping="Wrap"/> <TextBlock x:Name="UserSelectionDescription" Text="Changes will be applied to the currently logged-in user profile." Foreground="{DynamicResource FgColor}" FontSize="12" TextWrapping="Wrap" Margin="0,6,0,3"/>
</StackPanel> </StackPanel>
</Border> </Border>
<!-- Selected Changes --> <!-- App Removal Scope -->
<Border BorderBrush="{DynamicResource BorderColor}" BorderThickness="1" CornerRadius="4" Background="{DynamicResource CardBgColor}" Padding="16,12" Margin="0,0,0,16"> <Border x:Name="AppRemovalScopeSection" BorderBrush="{DynamicResource BorderColor}" BorderThickness="1" CornerRadius="4" Background="{DynamicResource CardBgColor}" Padding="16,12" Margin="0,0,0,16">
<StackPanel> <StackPanel>
<TextBlock Text="Selected Changes" FontWeight="Bold" FontSize="14" Foreground="{DynamicResource FgColor}" Margin="0,0,0,12"/> <TextBlock Text="Remove Apps From" Style="{StaticResource CategoryHeaderTextBlock}"/>
<StackPanel x:Name="OverviewChangesPanel"/> <ComboBox x:Name="AppRemovalScopeCombo" Margin="0,0,0,6" AutomationProperties.Name="App Removal Scope">
<ComboBoxItem x:Name="AppRemovalScopeAllUsers" Content="All users" IsSelected="True"/>
<ComboBoxItem x:Name="AppRemovalScopeCurrentUser" Content="Current user only"/>
<ComboBoxItem x:Name="AppRemovalScopeTargetUser" Content="Target user only" Visibility="Collapsed"/>
</ComboBox>
<TextBlock x:Name="AppRemovalScopeDescription" Text="Apps will be removed for all users and from the Windows image to prevent reinstallation for new users." Foreground="{DynamicResource FgColor}" FontSize="12" TextWrapping="Wrap" Margin="0,6,0,3"/>
</StackPanel> </StackPanel>
</Border> </Border>
<!-- System Restore Point --> <!-- Options -->
<Border BorderBrush="{DynamicResource BorderColor}" BorderThickness="1" CornerRadius="4" Background="{DynamicResource CardBgColor}" Padding="16,12" Margin="0,0,0,16"> <Border BorderBrush="{DynamicResource BorderColor}" BorderThickness="1" CornerRadius="4" Background="{DynamicResource CardBgColor}" Padding="16,12,16,3" Margin="0,0,0,16">
<StackPanel> <StackPanel>
<TextBlock Text="System Restore Point" FontWeight="Bold" FontSize="14" Foreground="{DynamicResource FgColor}" Margin="0,0,0,8"/> <TextBlock Text="Options" Style="{StaticResource CategoryHeaderTextBlock}"/>
<TextBlock Text="A restore point will allow you to revert your system to a previous state using the built-in System Restore feature. (Recommended)" Foreground="{DynamicResource FgColor}" FontSize="12" Margin="0,0,0,10" TextWrapping="Wrap"/>
<CheckBox x:Name="RestorePointCheckBox" Content="Create system restore point" Foreground="{DynamicResource FgColor}"/> <!-- Restore Point Option -->
<StackPanel>
<CheckBox x:Name="RestorePointCheckBox" Style="{StaticResource FeatureCheckboxStyle}" Content="Create a system restore point (Recommended)" AutomationProperties.Name="Create a system restore point (Recommended)"/>
</StackPanel>
<!-- Restart Explorer Option -->
<StackPanel>
<CheckBox x:Name="RestartExplorerCheckBox" Style="{StaticResource FeatureCheckboxStyle}" Content="Restart the Windows Explorer process to apply all changes immediately" AutomationProperties.Name="Restart the Windows Explorer process to apply all changes immediately"/>
</StackPanel>
</StackPanel> </StackPanel>
</Border> </Border>
<!-- Apply Changes Button --> <!-- Apply Changes Button -->
<Button x:Name="OverviewApplyBtn" Style="{StaticResource Win11Button}" Padding="14,8" Margin="0,0,0,15" HorizontalAlignment="Center"> <Button x:Name="OverviewApplyBtn" Style="{StaticResource PrimaryButtonStyle}" Width="190" Height="44" Margin="0,0,0,15" HorizontalAlignment="Center" AutomationProperties.Name="Apply Changes">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center"> <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="Apply Changes" VerticalAlignment="Center" FontSize="16" Margin="0,0,0,2"/> <TextBlock Text="&#xE73E;" FontFamily="Segoe Fluent Icons" FontSize="20" FontWeight="SemiBold" VerticalAlignment="Center"/>
<TextBlock Text="&#xE73E;" FontFamily="Segoe MDL2 Assets" FontSize="16" Margin="8,0,0,0" VerticalAlignment="Center"/> <TextBlock Text="Apply Changes" VerticalAlignment="Center" FontSize="18" FontWeight="SemiBold" Margin="8,0,0,4"/>
</StackPanel> </StackPanel>
</Button> </Button>
</StackPanel> </StackPanel>
@@ -756,15 +1061,17 @@
</Grid.RowDefinitions> </Grid.RowDefinitions>
<!-- Header --> <!-- Header -->
<StackPanel Grid.Row="0" Margin="20,10,20,10"> <Border DockPanel.Dock="Top" Padding="20,10,20,0">
<TextBlock Text="Applying Changes" FontWeight="Bold" FontSize="20" Margin="0,0,0,10" Foreground="{DynamicResource FgColor}"/> <StackPanel Grid.Row="0">
<TextBlock Text="Sit back and relax while Win11Debloat applies your selected changes" FontSize="13" Margin="0,0,0,10" Foreground="{DynamicResource FgColor}" TextWrapping="Wrap"/> <TextBlock Text="Applying Changes" FontWeight="Bold" FontSize="20" Margin="0,0,0,5" Foreground="{DynamicResource FgColor}"/>
</StackPanel> <TextBlock Text="Sit back and relax while Win11Debloat applies your selected changes" FontSize="13" Margin="0,0,0,20" Foreground="{DynamicResource FgColor}" TextWrapping="Wrap"/>
</StackPanel>
</Border>
<!-- Console Output --> <!-- Console Output -->
<Border Grid.Row="1" BorderBrush="{DynamicResource BorderColor}" BorderThickness="1" CornerRadius="4" Background="#0C0C0C" Margin="20,0"> <Border Grid.Row="1" BorderBrush="{DynamicResource BorderColor}" BorderThickness="1" CornerRadius="4" Background="#0C0C0C" Margin="20,0">
<ScrollViewer x:Name="ConsoleScrollViewer" VerticalScrollBarVisibility="Auto" Padding="10"> <ScrollViewer x:Name="ConsoleScrollViewer" VerticalScrollBarVisibility="Auto" Padding="10">
<TextBlock x:Name="ConsoleOutput" FontFamily="Consolas" FontSize="12" Foreground="#CCCCCC" TextWrapping="Wrap" Text=""/> <TextBlock x:Name="ConsoleOutput" FontFamily="Consolas" FontSize="12" Foreground="#CCCCCC" TextWrapping="Wrap" Text="" AutomationProperties.LiveSetting="Polite"/>
</ScrollViewer> </ScrollViewer>
</Border> </Border>
@@ -778,7 +1085,7 @@
<!-- Status and Finish Button --> <!-- Status and Finish Button -->
<StackPanel Grid.Row="1" HorizontalAlignment="Center"> <StackPanel Grid.Row="1" HorizontalAlignment="Center">
<Button x:Name="FinishBtn" Width="200" Height="48" Style="{StaticResource Win11Button}" Margin="0" IsEnabled="False"> <Button x:Name="FinishBtn" Width="200" Height="48" Style="{StaticResource PrimaryButtonStyle}" Margin="0" IsEnabled="False" AutomationProperties.Name="Finish">
<TextBlock x:Name="FinishBtnText" Text="Applying changes..." VerticalAlignment="Center" FontSize="16" Margin="0,0,0,1"/> <TextBlock x:Name="FinishBtnText" Text="Applying changes..." VerticalAlignment="Center" FontSize="16" Margin="0,0,0,1"/>
</Button> </Button>
</StackPanel> </StackPanel>
@@ -796,18 +1103,18 @@
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Button x:Name="PreviousBtn" Grid.Column="0" Width="120" Height="36" Style="{StaticResource Win11ButtonSecondary}" Visibility="Collapsed" Margin="10,0,0,0"> <Button x:Name="PreviousBtn" Grid.Column="0" Width="120" Height="36" Style="{StaticResource SecondaryButtonStyle}" Visibility="Collapsed" Margin="10,0,0,0" AutomationProperties.Name="Previous">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center"> <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="&#xE72B;" FontFamily="Segoe MDL2 Assets" FontSize="12" Margin="0,0,8,0" VerticalAlignment="Center"/> <TextBlock Text="&#xE72B;" FontFamily="Segoe Fluent Icons" FontSize="12" Margin="0,0,8,0" VerticalAlignment="Center"/>
<TextBlock Text="Previous" VerticalAlignment="Center" FontSize="14" Margin="0,0,0,1"/> <TextBlock Text="Previous" VerticalAlignment="Center" FontSize="14" Margin="0,0,0,1"/>
</StackPanel> </StackPanel>
</Button> </Button>
<StackPanel Grid.Column="2" Orientation="Horizontal" HorizontalAlignment="Right"> <StackPanel Grid.Column="2" Orientation="Horizontal" HorizontalAlignment="Right">
<Button x:Name="NextBtn" Width="120" Height="36" Margin="0,0,10,0" Style="{StaticResource Win11Button}"> <Button x:Name="NextBtn" Width="120" Height="36" Margin="0,0,10,0" Style="{StaticResource PrimaryButtonStyle}" AutomationProperties.Name="Next">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center"> <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="Next" VerticalAlignment="Center" FontSize="14" Margin="0,0,0,1"/> <TextBlock Text="Next" VerticalAlignment="Center" FontSize="14" Margin="0,0,0,1"/>
<TextBlock Text="&#xE72A;" FontFamily="Segoe MDL2 Assets" FontSize="12" Margin="8,0,0,0" VerticalAlignment="Center"/> <TextBlock Text="&#xE72A;" FontFamily="Segoe Fluent Icons" FontSize="12" Margin="8,0,0,0" VerticalAlignment="Center"/>
</StackPanel> </StackPanel>
</Button> </Button>
</StackPanel> </StackPanel>
@@ -820,6 +1127,16 @@
<Ellipse x:Name="ProgressIndicator3" Width="10" Height="10" Margin="4,0" Fill="#808080" ToolTip="Overview"/> <Ellipse x:Name="ProgressIndicator3" Width="10" Height="10" Margin="4,0" Fill="#808080" ToolTip="Overview"/>
</StackPanel> </StackPanel>
</Grid> </Grid>
<!-- Modal Overlay for MessageBoxes -->
<Rectangle x:Name="ModalOverlay"
Grid.RowSpan="3"
Fill="#80000000"
Visibility="Collapsed"
Panel.ZIndex="1000"
RadiusX="8"
RadiusY="8"
Margin="-1"/>
</Grid> </Grid>
</Border> </Border>
</Window> </Window>

View File

@@ -0,0 +1,168 @@
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MessageBox"
Width="440"
SizeToContent="Height"
ResizeMode="NoResize"
WindowStartupLocation="CenterScreen"
WindowStyle="None"
AllowsTransparency="True"
Background="Transparent"
Topmost="True"
ShowInTaskbar="False">
<Window.Resources>
<!-- Button Style -->
<Style x:Key="MessageBoxButton" TargetType="Button">
<Setter Property="Background" Value="{DynamicResource SecondaryButtonBg}"/>
<Setter Property="Foreground" Value="{DynamicResource FgColor}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="BorderBrush" Value="{DynamicResource ButtonBorderColor}"/>
<Setter Property="Padding" Value="0"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="Height" Value="32"/>
<Setter Property="MinWidth" Value="80"/>
<Setter Property="Margin" Value="4,0"/>
<Setter Property="FontWeight" Value="Normal"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border x:Name="Border"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="4"
Padding="{TemplateBinding Padding}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Border" Property="Background" Value="{DynamicResource SecondaryButtonHover}"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="Border" Property="Background" Value="{DynamicResource SecondaryButtonPressed}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- Primary Button Style -->
<Style x:Key="PrimaryMessageBoxButton" TargetType="Button" BasedOn="{StaticResource MessageBoxButton}">
<Setter Property="Background" Value="{DynamicResource ButtonBg}"/>
<Setter Property="Foreground" Value="white"/>
<Setter Property="BorderBrush" Value="{DynamicResource ButtonBg}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="4"
Padding="{TemplateBinding Padding}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,0,0,1"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Background" Value="{DynamicResource ButtonDisabled}"/>
<Setter Property="BorderBrush" Value="{DynamicResource ButtonDisabled}"/>
<Setter Property="Foreground" Value="{DynamicResource ButtonTextDisabled}"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{DynamicResource ButtonHover}"/>
<Setter Property="BorderBrush" Value="{DynamicResource ButtonHover}"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" Value="{DynamicResource ButtonPressed}"/>
<Setter Property="BorderBrush" Value="{DynamicResource ButtonPressed}"/>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Border BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1"
CornerRadius="8"
Background="{DynamicResource CardBgColor}"
Margin="25">
<Border.Effect>
<DropShadowEffect Color="Black"
Opacity="0.15"
BlurRadius="20"
ShadowDepth="0"
Direction="0"/>
</Border.Effect>
<Grid Margin="0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- Title Bar -->
<Grid Grid.Row="0" x:Name="TitleBar" Height="40" Background="Transparent">
<TextBlock x:Name="TitleText"
Text="Message"
Foreground="{DynamicResource FgColor}"
FontSize="16"
FontWeight="SemiBold"
VerticalAlignment="Center"
Margin="16,0,0,0"/>
</Grid>
<!-- Message Content -->
<Grid Grid.Row="1" Margin="24,12,24,20">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- Icon -->
<TextBlock x:Name="IconText"
Grid.Column="0"
FontFamily="Segoe Fluent Icons"
FontSize="24"
Foreground="{DynamicResource FgColor}"
VerticalAlignment="Center"
Margin="0,2,14,0"
Visibility="Collapsed"/>
<!-- Message Text -->
<TextBlock x:Name="MessageText"
Grid.Column="1"
Text="Message content goes here"
TextWrapping="Wrap"
FontSize="14"
LineHeight="20"
Foreground="{DynamicResource FgColor}"
VerticalAlignment="Center"/>
</Grid>
<!-- Button Panel -->
<Border Grid.Row="2"
Background="{DynamicResource BgColor}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="0,1,0,0"
Padding="16,12"
CornerRadius="0,0,8,8">
<StackPanel x:Name="ButtonPanel"
Orientation="Horizontal"
HorizontalAlignment="Right">
<Button x:Name="Button1"
Content="OK"
Style="{StaticResource PrimaryMessageBoxButton}"/>
<Button x:Name="Button2"
Content="Cancel"
Style="{StaticResource MessageBoxButton}"
Visibility="Collapsed"/>
</StackPanel>
</Border>
</Grid>
</Border>
</Window>

View File

@@ -0,0 +1,20 @@
# Prints the header for the script
function PrintHeader {
param (
$title
)
$fullTitle = " Win11Debloat Script - $title"
if ($script:Params.ContainsKey("Sysprep")) {
$fullTitle = "$fullTitle (Sysprep mode)"
}
else {
$fullTitle = "$fullTitle (User: $(GetUserName))"
}
Clear-Host
Write-Host "-------------------------------------------------------------------------------------------"
Write-Host $fullTitle
Write-Host "-------------------------------------------------------------------------------------------"
}

View File

@@ -0,0 +1,66 @@
# Prints all pending changes that will be made by the script
function PrintPendingChanges {
Write-Output "Win11Debloat will make the following changes:"
if ($script:Params['CreateRestorePoint']) {
Write-Output "- $($script:Features['CreateRestorePoint'].Label)"
}
foreach ($parameterName in $script:Params.Keys) {
if ($script:ControlParams -contains $parameterName) {
continue
}
# Print parameter description
switch ($parameterName) {
'Apps' {
continue
}
'CreateRestorePoint' {
continue
}
'RemoveApps' {
$appsList = GenerateAppsList
if ($appsList.Count -eq 0) {
Write-Host "No valid apps were selected for removal" -ForegroundColor Yellow
Write-Output ""
continue
}
Write-Output "- Remove $($appsList.Count) apps:"
Write-Host $appsList -ForegroundColor DarkGray
continue
}
'RemoveAppsCustom' {
$appsList = LoadAppsFromFile $script:CustomAppsListFilePath
if ($appsList.Count -eq 0) {
Write-Host "No valid apps were selected for removal" -ForegroundColor Yellow
Write-Output ""
continue
}
Write-Output "- Remove $($appsList.Count) apps:"
Write-Host $appsList -ForegroundColor DarkGray
continue
}
default {
if ($script:Features -and $script:Features.ContainsKey($parameterName)) {
$action = $script:Features[$parameterName].Action
$message = $script:Features[$parameterName].Label
Write-Output "- $action $message"
}
else {
# Fallback: show the parameter name if no feature description is available
Write-Output "- $parameterName"
}
continue
}
}
}
Write-Output ""
Write-Output ""
Write-Output "Press enter to execute the script or press CTRL+C to quit..."
Read-Host | Out-Null
}

View File

@@ -0,0 +1,28 @@
# Shows the CLI app removal menu and prompts the user to select which apps to remove.
function ShowCLIAppRemoval {
PrintHeader "App Removal"
Write-Output "> Opening app selection form..."
$result = Show-AppSelectionWindow
if ($result -eq $true) {
Write-Output "You have selected $($script:SelectedApps.Count) apps for removal"
AddParameter 'RemoveAppsCustom'
SaveSettings
# Suppress prompt if Silent parameter was passed
if (-not $Silent) {
Write-Output ""
Write-Output ""
Write-Output "Press enter to remove the selected apps or press CTRL+C to quit..."
Read-Host | Out-Null
PrintHeader "App Removal"
}
}
else {
Write-Host "Selection was cancelled, no apps have been removed" -ForegroundColor Red
Write-Output ""
}
}

View File

@@ -0,0 +1,33 @@
# Shows the CLI default mode app removal options. Loops until a valid option is selected.
function ShowCLIDefaultModeAppRemovalOptions {
PrintHeader 'Default Mode'
Write-Host "Please note: The default selection of apps includes Microsoft Teams, Spotify, Sticky Notes and more. Select option 2 to verify and change what apps are removed by the script" -ForegroundColor DarkGray
Write-Host ""
Do {
Write-Host "Options:" -ForegroundColor Yellow
Write-Host " (n) Don't remove any apps" -ForegroundColor Yellow
Write-Host " (1) Only remove the default selection of apps" -ForegroundColor Yellow
Write-Host " (2) Manually select which apps to remove" -ForegroundColor Yellow
$RemoveAppsInput = Read-Host "Do you want to remove any apps? Apps will be removed for all users (n/1/2)"
# Show app selection form if user entered option 3
if ($RemoveAppsInput -eq '2') {
$result = Show-AppSelectionWindow
if ($result -ne $true) {
# User cancelled or closed app selection, change RemoveAppsInput so the menu will be shown again
Write-Host ""
Write-Host "Cancelled application selection, please try again" -ForegroundColor Red
$RemoveAppsInput = 'c'
}
Write-Host ""
}
}
while ($RemoveAppsInput -ne 'n' -and $RemoveAppsInput -ne '0' -and $RemoveAppsInput -ne '1' -and $RemoveAppsInput -ne '2')
return $RemoveAppsInput
}

View File

@@ -0,0 +1,55 @@
# Show CLI default mode options for removing apps, or set selection if RunDefaults or RunDefaultsLite parameter was passed
function ShowCLIDefaultModeOptions {
if ($RunDefaults) {
$RemoveAppsInput = '1'
}
elseif ($RunDefaultsLite) {
$RemoveAppsInput = '0'
}
else {
$RemoveAppsInput = ShowCLIDefaultModeAppRemovalOptions
if ($RemoveAppsInput -eq '2' -and ($script:SelectedApps.contains('Microsoft.XboxGameOverlay') -or $script:SelectedApps.contains('Microsoft.XboxGamingOverlay')) -and
$( Read-Host -Prompt "Disable Game Bar integration and game/screen recording? This also stops ms-gamingoverlay and ms-gamebar popups (y/n)" ) -eq 'y') {
$DisableGameBarIntegrationInput = $true;
}
}
PrintHeader 'Default Mode'
# Add default settings based on user input
try {
# Select app removal options based on user input
switch ($RemoveAppsInput) {
'1' {
AddParameter 'RemoveApps'
AddParameter 'Apps' 'Default'
}
'2' {
AddParameter 'RemoveAppsCustom'
if ($DisableGameBarIntegrationInput) {
AddParameter 'DisableDVR'
AddParameter 'DisableGameBarIntegration'
}
}
}
# Load settings from DefaultSettings.json and add to params
LoadSettings -filePath $script:DefaultSettingsFilePath -expectedVersion "1.0"
}
catch {
Write-Error "Failed to load settings from DefaultSettings.json file: $_"
AwaitKeyToExit
}
SaveSettings
# Skip change summary if Silent parameter was passed
if ($Silent) {
return
}
PrintPendingChanges
PrintHeader 'Default Mode'
}

View File

@@ -0,0 +1,16 @@
# Shows the CLI last used settings from LastUsedSettings.json file, displays pending changes and prompts the user to apply them.
function ShowCLILastUsedSettings {
PrintHeader 'Custom Mode'
try {
# Load settings from LastUsedSettings.json and add to params
LoadSettings -filePath $script:SavedSettingsFilePath -expectedVersion "1.0"
}
catch {
Write-Error "Failed to load settings from LastUsedSettings.json file: $_"
AwaitKeyToExit
}
PrintPendingChanges
PrintHeader 'Custom Mode'
}

View File

@@ -0,0 +1,30 @@
# Shows the CLI menu options and prompts the user to select one. Loops until a valid option is selected.
function ShowCLIMenuOptions {
Do {
$ModeSelectionMessage = "Please select an option (1/2)"
PrintHeader 'Menu'
Write-Host "(1) Default mode: Quickly apply the recommended changes"
Write-Host "(2) App removal mode: Select & remove apps, without making other changes"
# Only show this option if SavedSettings file exists
if (Test-Path $script:SavedSettingsFilePath) {
Write-Host "(3) Quickly apply your last used settings"
$ModeSelectionMessage = "Please select an option (1/2/3)"
}
Write-Host ""
Write-Host ""
$Mode = Read-Host $ModeSelectionMessage
if (($Mode -eq '3') -and -not (Test-Path $script:SavedSettingsFilePath)) {
$Mode = $null
}
}
while ($Mode -ne '1' -and $Mode -ne '2' -and $Mode -ne '3')
return $Mode
}

View File

@@ -0,0 +1,44 @@
# Read Apps.json and return list of app objects with optional filtering
function LoadAppsDetailsFromJson {
param (
[switch]$OnlyInstalled,
[string]$InstalledList = "",
[switch]$InitialCheckedFromJson
)
$apps = @()
try {
$jsonContent = Get-Content -Path $script:AppsListFilePath -Raw | ConvertFrom-Json
}
catch {
Write-Error "Failed to read Apps.json: $_"
return $apps
}
foreach ($appData in $jsonContent.Apps) {
$appId = $appData.AppId.Trim()
if ($appId.length -eq 0) { continue }
if ($OnlyInstalled) {
if (-not ($InstalledList -like ("*$appId*")) -and -not (Get-AppxPackage -Name $appId)) {
continue
}
if (($appId -eq "Microsoft.Edge") -and -not ($InstalledList -like "* Microsoft.Edge *")) {
continue
}
}
$displayName = if ($appData.FriendlyName) { "$($appData.FriendlyName) ($appId)" } else { $appId }
$isChecked = if ($InitialCheckedFromJson) { $appData.SelectedByDefault } else { $false }
$apps += [PSCustomObject]@{
AppId = $appId
DisplayName = $displayName
IsChecked = $isChecked
Description = $appData.Description
SelectedByDefault = $appData.SelectedByDefault
}
}
return $apps
}

View File

@@ -0,0 +1,45 @@
# Returns list of apps from the specified file, it trims the app names and removes any comments
function LoadAppsFromFile {
param (
$appsFilePath
)
$appsList = @()
if (-not (Test-Path $appsFilePath)) {
return $appsList
}
try {
# Check if file is JSON or text format
if ($appsFilePath -like "*.json") {
# JSON file format
$jsonContent = Get-Content -Path $appsFilePath -Raw | ConvertFrom-Json
Foreach ($appData in $jsonContent.Apps) {
$appId = $appData.AppId.Trim()
$selectedByDefault = $appData.SelectedByDefault
if ($selectedByDefault -and $appId.length -gt 0) {
$appsList += $appId
}
}
}
else {
# Legacy text file format
Foreach ($app in (Get-Content -Path $appsFilePath | Where-Object { $_ -notmatch '^#.*' -and $_ -notmatch '^\s*$' } )) {
if (-not ($app.IndexOf('#') -eq -1)) {
$app = $app.Substring(0, $app.IndexOf('#'))
}
$app = $app.Trim()
$appString = $app.Trim('*')
$appsList += $appString
}
}
return $appsList
}
catch {
Write-Error "Unable to read apps list from file: $appsFilePath"
AwaitKeyToExit
}
}

View File

@@ -0,0 +1,32 @@
# Loads a JSON file from the specified path and returns the parsed object
# Returns $null if the file doesn't exist or if parsing fails
function LoadJsonFile {
param (
[string]$filePath,
[string]$expectedVersion = $null,
[switch]$optionalFile
)
if (-not (Test-Path $filePath)) {
if (-not $optionalFile) {
Write-Error "File not found: $filePath"
}
return $null
}
try {
$jsonContent = Get-Content -Path $filePath -Raw | ConvertFrom-Json
# Validate version if specified
if ($expectedVersion -and $jsonContent.Version -and $jsonContent.Version -ne $expectedVersion) {
Write-Error "$(Split-Path $filePath -Leaf) version mismatch (expected $expectedVersion, found $($jsonContent.Version))"
return $null
}
return $jsonContent
}
catch {
Write-Error "Failed to parse JSON file: $filePath"
return $null
}
}

View File

@@ -0,0 +1,31 @@
# Loads settings from a JSON file and adds them to script params
function LoadSettings {
param (
[string]$filePath,
[string]$expectedVersion = "1.0"
)
$settingsJson = LoadJsonFile -filePath $filePath -expectedVersion $expectedVersion
if (-not $settingsJson -or -not $settingsJson.Settings) {
throw "Failed to load settings from $(Split-Path $filePath -Leaf)"
}
# Get current Windows build version
$WinVersion = Get-ItemPropertyValue 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' CurrentBuild
foreach ($setting in $settingsJson.Settings) {
if ($setting.Value -eq $false) {
continue
}
$feature = $script:Features[$setting.Name]
# Check version and feature compatibility using Features.json
if (($feature.MinVersion -and $WinVersion -lt $feature.MinVersion) -or ($feature.MaxVersion -and $WinVersion -gt $feature.MaxVersion) -or ($feature.FeatureId -eq 'DisableModernStandbyNetworking' -and (-not $script:ModernStandbySupported))) {
continue
}
AddParameter $setting.Name $setting.Value
}
}

View File

@@ -0,0 +1,15 @@
# Saves the provided appsList to the CustomAppsList file
function SaveCustomAppsListToFile {
param (
$appsList
)
$script:SelectedApps = $appsList
# Create file that stores selected apps if it doesn't exist
if (-not (Test-Path $script:CustomAppsListFilePath)) {
$null = New-Item $script:CustomAppsListFilePath -ItemType File
}
Set-Content -Path $script:CustomAppsListFilePath -Value $script:SelectedApps
}

View File

@@ -0,0 +1,26 @@
# Saves the current settings, excluding control parameters, to 'LastUsedSettings.json' file
function SaveSettings {
$settings = @{
"Version" = "1.0"
"Settings" = @()
}
foreach ($param in $script:Params.Keys) {
if ($script:ControlParams -notcontains $param) {
$value = $script:Params[$param]
$settings.Settings += @{
"Name" = $param
"Value" = $value
}
}
}
try {
$settings | ConvertTo-Json -Depth 10 | Set-Content $script:SavedSettingsFilePath
}
catch {
Write-Output ""
Write-Host "Error: Failed to save settings to LastUsedSettings.json file" -ForegroundColor Red
}
}

View File

@@ -0,0 +1,24 @@
# Returns a validated list of apps based on the provided appsList and the supported apps from Apps.json
function ValidateAppslist {
param (
$appsList
)
$supportedAppsList = (LoadAppsDetailsFromJson | ForEach-Object { $_.AppId })
$validatedAppsList = @()
# Validate provided appsList against supportedAppsList
Foreach ($app in $appsList) {
$app = $app.Trim()
$appString = $app.Trim('*')
if ($supportedAppsList -notcontains $appString) {
Write-Host "Removal of app '$appString' is not supported and will be skipped" -ForegroundColor Yellow
continue
}
$validatedAppsList += $appString
}
return $validatedAppsList
}

View File

@@ -0,0 +1,80 @@
# Applies settings from a JSON object to UI controls (checkboxes and comboboxes)
# Used by LoadDefaultsBtn and LoadLastUsedBtn in the UI
function ApplySettingsToUiControls {
param (
$window,
$settingsJson,
$uiControlMappings
)
if (-not $settingsJson -or -not $settingsJson.Settings) {
return $false
}
# First, reset all tweaks to "No Change" (index 0) or unchecked
if ($uiControlMappings) {
foreach ($comboName in $uiControlMappings.Keys) {
$control = $window.FindName($comboName)
if ($control -is [System.Windows.Controls.CheckBox]) {
$control.IsChecked = $false
}
elseif ($control -is [System.Windows.Controls.ComboBox]) {
$control.SelectedIndex = 0
}
}
}
# Also uncheck RestorePointCheckBox
$restorePointCheckBox = $window.FindName('RestorePointCheckBox')
if ($restorePointCheckBox) {
$restorePointCheckBox.IsChecked = $false
}
# Apply settings from JSON
foreach ($setting in $settingsJson.Settings) {
if ($setting.Value -ne $true) { continue }
$paramName = $setting.Name
# Handle RestorePointCheckBox separately
if ($paramName -eq 'CreateRestorePoint') {
if ($restorePointCheckBox) { $restorePointCheckBox.IsChecked = $true }
continue
}
if ($uiControlMappings) {
foreach ($comboName in $uiControlMappings.Keys) {
$mapping = $uiControlMappings[$comboName]
if ($mapping.Type -eq 'group') {
$i = 1
foreach ($val in $mapping.Values) {
if ($val.FeatureIds -contains $paramName) {
$control = $window.FindName($comboName)
if ($control -and $control.Visibility -eq 'Visible') {
if ($control -is [System.Windows.Controls.ComboBox]) {
$control.SelectedIndex = $i
}
}
break
}
$i++
}
}
elseif ($mapping.Type -eq 'feature') {
if ($mapping.FeatureId -eq $paramName) {
$control = $window.FindName($comboName)
if ($control -and $control.Visibility -eq 'Visible') {
if ($control -is [System.Windows.Controls.CheckBox]) {
$control.IsChecked = $true
}
elseif ($control -is [System.Windows.Controls.ComboBox]) {
$control.SelectedIndex = 1
}
}
}
}
}
}
}
return $true
}

View File

@@ -0,0 +1,71 @@
# Attaches shift-click selection behavior to a checkbox in an apps panel
# Parameters:
# - $checkbox: The checkbox to attach the behavior to
# - $appsPanel: The StackPanel containing checkbox items
# - $lastSelectedCheckboxRef: A reference to a variable storing the last clicked checkbox
# - $updateStatusCallback: Optional callback to update selection status
function AttachShiftClickBehavior {
param (
[System.Windows.Controls.CheckBox]$checkbox,
[System.Windows.Controls.StackPanel]$appsPanel,
[ref]$lastSelectedCheckboxRef,
[scriptblock]$updateStatusCallback = $null
)
# Use a closure to capture the parameters
$checkbox.Add_PreviewMouseLeftButtonDown({
param(
$sender,
$e
)
$isShiftPressed = [System.Windows.Input.Keyboard]::IsKeyDown([System.Windows.Input.Key]::LeftShift) -or
[System.Windows.Input.Keyboard]::IsKeyDown([System.Windows.Input.Key]::RightShift)
if ($isShiftPressed -and $null -ne $lastSelectedCheckboxRef.Value) {
# Get all visible checkboxes in the panel
$visibleCheckboxes = @()
foreach ($child in $appsPanel.Children) {
if ($child -is [System.Windows.Controls.CheckBox] -and $child.Visibility -eq 'Visible') {
$visibleCheckboxes += $child
}
}
# Find indices of the last selected and current checkbox
$lastIndex = -1
$currentIndex = -1
for ($i = 0; $i -lt $visibleCheckboxes.Count; $i++) {
if ($visibleCheckboxes[$i] -eq $lastSelectedCheckboxRef.Value) {
$lastIndex = $i
}
if ($visibleCheckboxes[$i] -eq $sender) {
$currentIndex = $i
}
}
if ($lastIndex -ge 0 -and $currentIndex -ge 0 -and $lastIndex -ne $currentIndex) {
$startIndex = [Math]::Min($lastIndex, $currentIndex)
$endIndex = [Math]::Max($lastIndex, $currentIndex)
$shouldDeselect = $sender.IsChecked
# Set all checkboxes in the range to the appropriate state
for ($i = $startIndex; $i -le $endIndex; $i++) {
$visibleCheckboxes[$i].IsChecked = -not $shouldDeselect
}
if ($updateStatusCallback) {
& $updateStatusCallback
}
# Mark the event as handled to prevent the default toggle behavior
$e.Handled = $true
return
}
}
# Update the last selected checkbox reference for next time
$lastSelectedCheckboxRef.Value = $sender
}.GetNewClosure())
}

View File

@@ -0,0 +1,9 @@
# Checks if the system is set to use dark mode for apps
function GetSystemUsesDarkMode {
try {
return (Get-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize' -Name 'AppsUseLightTheme').AppsUseLightTheme -eq 0
}
catch {
return $false
}
}

View File

@@ -0,0 +1,69 @@
# Sets resource colors for a WPF window based on dark mode preference
function SetWindowThemeResources {
param (
$window,
[bool]$usesDarkMode
)
if ($usesDarkMode) {
$window.Resources.Add("BgColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#202020")))
$window.Resources.Add("FgColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#FFFFFF")))
$window.Resources.Add("CardBgColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#2b2b2b")))
$window.Resources.Add("BorderColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#404040")))
$window.Resources.Add("ButtonBorderColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#404040")))
$window.Resources.Add("CheckBoxBgColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#272727")))
$window.Resources.Add("CheckBoxBorderColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#808080")))
$window.Resources.Add("CheckBoxHoverColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#343434")))
$window.Resources.Add("ComboBgColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#373737")))
$window.Resources.Add("ComboHoverColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#434343")))
$window.Resources.Add("ComboItemBgColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#2c2c2c")))
$window.Resources.Add("ComboItemHoverColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#383838")))
$window.Resources.Add("ComboItemSelectedColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#343434")))
$window.Resources.Add("AccentColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#FFD700")))
$window.Resources.Add("ButtonDisabled", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#434343")))
$window.Resources.Add("ButtonTextDisabled", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#989898")))
$window.Resources.Add("SecondaryButtonBg", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#393939")))
$window.Resources.Add("SecondaryButtonHover", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#2a2a2a")))
$window.Resources.Add("SecondaryButtonPressed", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#1e1e1e")))
$window.Resources.Add("SecondaryButtonDisabled", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#3b3b3b")))
$window.Resources.Add("SecondaryButtonTextDisabled", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#787878")))
$window.Resources.Add("InputFocusColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#1f1f1f")))
$window.Resources.Add("ScrollBarThumbColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#3d3d3d")))
$window.Resources.Add("ScrollBarThumbHoverColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#4b4b4b")))
}
else {
$window.Resources.Add("BgColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#f3f3f3")))
$window.Resources.Add("FgColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#000000")))
$window.Resources.Add("CardBgColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#fbfbfb")))
$window.Resources.Add("BorderColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#ededed")))
$window.Resources.Add("ButtonBorderColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#d3d3d3")))
$window.Resources.Add("CheckBoxBgColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#f5f5f5")))
$window.Resources.Add("CheckBoxBorderColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#898989")))
$window.Resources.Add("CheckBoxHoverColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#ececec")))
$window.Resources.Add("ComboBgColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#FFFFFF")))
$window.Resources.Add("ComboHoverColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#f8f8f8")))
$window.Resources.Add("ComboItemBgColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#f9f9f9")))
$window.Resources.Add("ComboItemHoverColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#f0f0f0")))
$window.Resources.Add("ComboItemSelectedColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#f3f3f3")))
$window.Resources.Add("AccentColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#ffae00")))
$window.Resources.Add("ButtonDisabled", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#bfbfbf")))
$window.Resources.Add("ButtonTextDisabled", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#ffffff")))
$window.Resources.Add("SecondaryButtonBg", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#fbfbfb")))
$window.Resources.Add("SecondaryButtonHover", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#f6f6f6")))
$window.Resources.Add("SecondaryButtonPressed", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#f0f0f0")))
$window.Resources.Add("SecondaryButtonDisabled", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#f7f7f7")))
$window.Resources.Add("SecondaryButtonTextDisabled", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#b7b7b7")))
$window.Resources.Add("InputFocusColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#fbfbfb")))
$window.Resources.Add("ScrollBarThumbColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#b9b9b9")))
$window.Resources.Add("ScrollBarThumbHoverColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#8b8b8b")))
}
$window.Resources.Add("ButtonBg", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#0067c0")))
$window.Resources.Add("ButtonHover", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#1E88E5")))
$window.Resources.Add("ButtonPressed", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#3284cc")))
$window.Resources.Add("CloseHover", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#c42b1c")))
$window.Resources.Add("InformationIconColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#0078D4")))
$window.Resources.Add("WarningIconColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#FFB900")))
$window.Resources.Add("ErrorIconColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#E81123")))
$window.Resources.Add("QuestionIconColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#0078D4")))
}

View File

@@ -0,0 +1,95 @@
function Show-AboutDialog {
param (
[Parameter(Mandatory=$false)]
[System.Windows.Window]$Owner = $null
)
Add-Type -AssemblyName PresentationFramework,PresentationCore,WindowsBase | Out-Null
$usesDarkMode = GetSystemUsesDarkMode
# Determine owner window
$ownerWindow = if ($Owner) { $Owner } else { $script:GuiWindow }
# Show overlay if owner window exists
$overlay = $null
if ($ownerWindow) {
try {
$overlay = $ownerWindow.FindName('ModalOverlay')
if ($overlay) {
$ownerWindow.Dispatcher.Invoke([action]{ $overlay.Visibility = 'Visible' })
}
}
catch { }
}
# Load XAML from file
$xaml = Get-Content -Path $script:AboutWindowSchema -Raw
$reader = [System.Xml.XmlReader]::Create([System.IO.StringReader]::new($xaml))
try {
$aboutWindow = [System.Windows.Markup.XamlReader]::Load($reader)
}
finally {
$reader.Close()
}
# Set owner to owner window if it exists
if ($ownerWindow) {
try {
$aboutWindow.Owner = $ownerWindow
}
catch { }
}
# Apply theme resources
SetWindowThemeResources -window $aboutWindow -usesDarkMode $usesDarkMode
# Get UI elements
$titleBar = $aboutWindow.FindName('TitleBar')
$versionText = $aboutWindow.FindName('VersionText')
$projectLink = $aboutWindow.FindName('ProjectLink')
$kofiLink = $aboutWindow.FindName('KofiLink')
$closeButton = $aboutWindow.FindName('CloseButton')
# Set version
$versionText.Text = $script:Version
# Title bar drag to move window
$titleBar.Add_MouseLeftButtonDown({
$aboutWindow.DragMove()
})
# Project link click handler
$projectLink.Add_MouseLeftButtonDown({
Start-Process "https://github.com/Raphire/Win11Debloat"
})
# Ko-fi link click handler
$kofiLink.Add_MouseLeftButtonDown({
Start-Process "https://ko-fi.com/raphire"
})
# Close button handler
$closeButton.Add_Click({
$aboutWindow.Close()
})
# Handle Escape key to close
$aboutWindow.Add_KeyDown({
param($sender, $e)
if ($e.Key -eq 'Escape') {
$aboutWindow.Close()
}
})
# Show dialog
$aboutWindow.ShowDialog() | Out-Null
# Hide overlay after dialog closes
if ($overlay) {
try {
$ownerWindow.Dispatcher.Invoke([action]{ $overlay.Visibility = 'Collapsed' })
}
catch { }
}
}

View File

@@ -0,0 +1,161 @@
# Shows application selection window that allows the user to select what apps they want to remove or keep
function Show-AppSelectionWindow {
Add-Type -AssemblyName PresentationFramework,PresentationCore,WindowsBase | Out-Null
$usesDarkMode = GetSystemUsesDarkMode
# Show overlay if main window exists
$overlay = $null
if ($script:GuiWindow) {
try {
$overlay = $script:GuiWindow.FindName('ModalOverlay')
if ($overlay) {
$script:GuiWindow.Dispatcher.Invoke([action]{ $overlay.Visibility = 'Visible' })
}
}
catch { }
}
# Load XAML from file
$xaml = Get-Content -Path $script:AppSelectionSchema -Raw
$reader = [System.Xml.XmlReader]::Create([System.IO.StringReader]::new($xaml))
try {
$window = [System.Windows.Markup.XamlReader]::Load($reader)
}
finally {
$reader.Close()
}
# Set owner to main window if it exists
if ($script:GuiWindow) {
try {
$window.Owner = $script:GuiWindow
}
catch { }
}
SetWindowThemeResources -window $window -usesDarkMode $usesDarkMode
$appsPanel = $window.FindName('AppsPanel')
$checkAllBox = $window.FindName('CheckAllBox')
$onlyInstalledBox = $window.FindName('OnlyInstalledBox')
$confirmBtn = $window.FindName('ConfirmBtn')
$loadingIndicator = $window.FindName('LoadingAppsIndicator')
$titleBar = $window.FindName('TitleBar')
# Track the last selected checkbox for shift-click range selection
$script:AppSelectionWindowLastSelectedCheckbox = $null
# Loads apps into the apps UI
function LoadApps {
# Show loading indicator
$loadingIndicator.Visibility = 'Visible'
$window.Dispatcher.Invoke([System.Windows.Threading.DispatcherPriority]::Background, [action]{})
$appsPanel.Children.Clear()
$listOfApps = ""
if ($onlyInstalledBox.IsChecked -and ($script:WingetInstalled -eq $true)) {
# Attempt to get a list of installed apps via WinGet, times out after 10 seconds
$listOfApps = GetInstalledAppsViaWinget -TimeOut 10
if (-not $listOfApps) {
# Show error that the script was unable to get list of apps from WinGet
Show-MessageBox -Message 'Unable to load list of installed apps via WinGet.' -Title 'Error' -Button 'OK' -Icon 'Error' -Owner $window | Out-Null
$onlyInstalledBox.IsChecked = $false
}
}
$appsToAdd = LoadAppsDetailsFromJson -OnlyInstalled:$onlyInstalledBox.IsChecked -InstalledList $listOfApps -InitialCheckedFromJson:$true
# Reset the last selected checkbox when loading a new list
$script:AppSelectionWindowLastSelectedCheckbox = $null
# Sort apps alphabetically and add to panel
$appsToAdd | Sort-Object -Property DisplayName | ForEach-Object {
$checkbox = New-Object System.Windows.Controls.CheckBox
$checkbox.Content = $_.DisplayName
$checkbox.SetValue([System.Windows.Automation.AutomationProperties]::NameProperty, $_.DisplayName)
$checkbox.Tag = $_.AppId
$checkbox.IsChecked = $_.IsChecked
$checkbox.ToolTip = $_.Description
$checkbox.Style = $window.Resources["AppsPanelCheckBoxStyle"]
# Attach shift-click behavior for range selection
AttachShiftClickBehavior -checkbox $checkbox -appsPanel $appsPanel -lastSelectedCheckboxRef ([ref]$script:AppSelectionWindowLastSelectedCheckbox)
$appsPanel.Children.Add($checkbox) | Out-Null
}
# Hide loading indicator
$loadingIndicator.Visibility = 'Collapsed'
}
# Event handlers
$titleBar.Add_MouseLeftButtonDown({
$window.DragMove()
})
$checkAllBox.Add_Checked({
foreach ($child in $appsPanel.Children) {
if ($child -is [System.Windows.Controls.CheckBox]) {
$child.IsChecked = $true
}
}
})
$checkAllBox.Add_Unchecked({
foreach ($child in $appsPanel.Children) {
if ($child -is [System.Windows.Controls.CheckBox]) {
$child.IsChecked = $false
}
}
})
$onlyInstalledBox.Add_Checked({ LoadApps })
$onlyInstalledBox.Add_Unchecked({ LoadApps })
$confirmBtn.Add_Click({
$selectedApps = @()
foreach ($child in $appsPanel.Children) {
if ($child -is [System.Windows.Controls.CheckBox] -and $child.IsChecked) {
$selectedApps += $child.Tag
}
}
# Close form without saving if no apps were selected
if ($selectedApps.Count -eq 0) {
$window.Close()
return
}
if ($selectedApps -contains "Microsoft.WindowsStore" -and -not $Silent) {
$result = Show-MessageBox -Message 'Are you sure you wish to uninstall the Microsoft Store? This app cannot easily be reinstalled.' -Title 'Are you sure?' -Button 'YesNo' -Icon 'Warning' -Owner $window
if ($result -eq 'No') {
return
}
}
SaveCustomAppsListToFile -appsList $selectedApps
$window.DialogResult = $true
})
# Load apps after window is shown (allows UI to render first)
$window.Add_ContentRendered({
$window.Dispatcher.Invoke([System.Windows.Threading.DispatcherPriority]::Background, [action]{ LoadApps })
})
# Show the window and return dialog result
$result = $window.ShowDialog()
# Hide overlay after dialog closes
if ($overlay) {
try {
$script:GuiWindow.Dispatcher.Invoke([action]{ $overlay.Visibility = 'Collapsed' })
}
catch { }
}
return $result
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,154 @@
# Shows a Windows 11 styled custom message box
function Show-MessageBox {
param (
[Parameter(Mandatory=$true)]
[string]$Message,
[Parameter(Mandatory=$false)]
[string]$Title = "Win11Debloat",
[Parameter(Mandatory=$false)]
[ValidateSet('OK', 'OKCancel', 'YesNo')]
[string]$Button = 'OK',
[Parameter(Mandatory=$false)]
[ValidateSet('None', 'Information', 'Warning', 'Error', 'Question')]
[string]$Icon = 'None',
[Parameter(Mandatory=$false)]
[System.Windows.Window]$Owner = $null
)
Add-Type -AssemblyName PresentationFramework,PresentationCore,WindowsBase | Out-Null
$usesDarkMode = GetSystemUsesDarkMode
# Determine owner window - use provided Owner, or fall back to main GUI window
$ownerWindow = if ($Owner) { $Owner } else { $script:GuiWindow }
# Show overlay if owner window exists
$overlay = $null
if ($ownerWindow) {
try {
$overlay = $ownerWindow.FindName('ModalOverlay')
if ($overlay) {
$ownerWindow.Dispatcher.Invoke([action]{ $overlay.Visibility = 'Visible' })
}
}
catch { }
}
# Load XAML from file
$xaml = Get-Content -Path $script:MessageBoxSchema -Raw
$reader = [System.Xml.XmlReader]::Create([System.IO.StringReader]::new($xaml))
try {
$msgWindow = [System.Windows.Markup.XamlReader]::Load($reader)
}
finally {
$reader.Close()
}
# Set owner to owner window if it exists
if ($ownerWindow) {
try {
$msgWindow.Owner = $ownerWindow
}
catch { }
}
# Apply theme resources
SetWindowThemeResources -window $msgWindow -usesDarkMode $usesDarkMode
# Get UI elements
$titleText = $msgWindow.FindName('TitleText')
$messageText = $msgWindow.FindName('MessageText')
$iconText = $msgWindow.FindName('IconText')
$button1 = $msgWindow.FindName('Button1')
$button2 = $msgWindow.FindName('Button2')
$titleBar = $msgWindow.FindName('TitleBar')
# Set title and message
$titleText.Text = $Title
$messageText.Text = $Message
# Configure icon
switch ($Icon) {
'Information' {
$iconText.Text = [char]0xE946
$iconText.Foreground = $msgWindow.FindResource('InformationIconColor')
$iconText.Visibility = 'Visible'
}
'Warning' {
$iconText.Text = [char]0xE7BA
$iconText.Foreground = $msgWindow.FindResource('WarningIconColor')
$iconText.Visibility = 'Visible'
}
'Error' {
$iconText.Text = [char]0xEA39
$iconText.Foreground = $msgWindow.FindResource('ErrorIconColor')
$iconText.Visibility = 'Visible'
}
'Question' {
$iconText.Text = [char]0xE897
$iconText.Foreground = $msgWindow.FindResource('QuestionIconColor')
$iconText.Visibility = 'Visible'
}
default {
$iconText.Visibility = 'Collapsed'
}
}
# Configure buttons - store result in window's Tag property
switch ($Button) {
'OK' {
$button1.Content = 'OK'
$button1.Add_Click({ $msgWindow.Tag = 'OK'; $msgWindow.Close() })
$button2.Visibility = 'Collapsed'
}
'OKCancel' {
$button1.Content = 'OK'
$button2.Content = 'Cancel'
$button1.Add_Click({ $msgWindow.Tag = 'OK'; $msgWindow.Close() })
$button2.Add_Click({ $msgWindow.Tag = 'Cancel'; $msgWindow.Close() })
$button2.Visibility = 'Visible'
}
'YesNo' {
$button1.Content = 'Yes'
$button2.Content = 'No'
$button1.Add_Click({ $msgWindow.Tag = 'Yes'; $msgWindow.Close() })
$button2.Add_Click({ $msgWindow.Tag = 'No'; $msgWindow.Close() })
$button2.Visibility = 'Visible'
}
}
# Title bar drag to move window
$titleBar.Add_MouseLeftButtonDown({
$msgWindow.DragMove()
})
# Handle Escape key to close
$msgWindow.Add_KeyDown({
param($sender, $e)
if ($e.Key -eq 'Escape') {
if ($Button -eq 'OK') {
$msgWindow.Tag = 'OK'
} else {
$msgWindow.Tag = 'Cancel'
}
$msgWindow.Close()
}
})
# Show dialog and return result from Tag
$msgWindow.ShowDialog() | Out-Null
# Hide overlay after dialog closes
if ($overlay) {
try {
$ownerWindow.Dispatcher.Invoke([action]{ $overlay.Visibility = 'Collapsed' })
}
catch { }
}
return $msgWindow.Tag
}

View File

@@ -12,6 +12,7 @@ param (
[switch]$RunDefaultsLite, [switch]$RunDefaultsLite,
[switch]$RunSavedSettings, [switch]$RunSavedSettings,
[string]$Apps, [string]$Apps,
[string]$AppRemovalTarget,
[switch]$RemoveApps, [switch]$RemoveApps,
[switch]$RemoveAppsCustom, [switch]$RemoveAppsCustom,
[switch]$RemoveGamingApps, [switch]$RemoveGamingApps,
@@ -23,7 +24,11 @@ param (
[switch]$DisableGameBarIntegration, [switch]$DisableGameBarIntegration,
[switch]$DisableTelemetry, [switch]$DisableTelemetry,
[switch]$DisableFastStartup, [switch]$DisableFastStartup,
[switch]$DisableBitlockerAutoEncryption,
[switch]$DisableModernStandbyNetworking, [switch]$DisableModernStandbyNetworking,
[switch]$DisableUpdateASAP,
[switch]$PreventUpdateAutoReboot,
[switch]$DisableDeliveryOptimization,
[switch]$DisableBing, [switch]$DisableBing,
[switch]$DisableDesktopSpotlight, [switch]$DisableDesktopSpotlight,
[switch]$DisableLockscreenTips, [switch]$DisableLockscreenTips,
@@ -64,6 +69,10 @@ param (
[switch]$DisableDragTray, [switch]$DisableDragTray,
[switch]$DisableMouseAcceleration, [switch]$DisableMouseAcceleration,
[switch]$DisableStickyKeys, [switch]$DisableStickyKeys,
[switch]$DisableWindowSnapping,
[switch]$DisableSnapAssist,
[switch]$DisableSnapLayouts,
[switch]$HideTabsInAltTab, [switch]$Show3TabsInAltTab, [switch]$Show5TabsInAltTab, [switch]$Show20TabsInAltTab,
[switch]$HideHome, [switch]$HideHome,
[switch]$HideGallery, [switch]$HideGallery,
[switch]$ExplorerToHome, [switch]$ExplorerToHome,
@@ -112,7 +121,7 @@ catch {
if (Test-Path "$env:TEMP/Win11Debloat") { if (Test-Path "$env:TEMP/Win11Debloat") {
Write-Output "" Write-Output ""
Write-Output "> Cleaning up old Win11Debloat folder..." Write-Output "> Cleaning up old Win11Debloat folder..."
Get-ChildItem -Path "$env:TEMP/Win11Debloat" -Exclude CustomAppsList,LastUsedSettings.json,Win11Debloat.log | Remove-Item -Recurse -Force Get-ChildItem -Path "$env:TEMP/Win11Debloat" -Exclude CustomAppsList,LastUsedSettings.json,Win11Debloat.log,Logs | Remove-Item -Recurse -Force
} }
Write-Output "" Write-Output ""
@@ -140,8 +149,16 @@ $arguments = $($PSBoundParameters.GetEnumerator() | ForEach-Object {
Write-Output "" Write-Output ""
Write-Output "> Running Win11Debloat..." Write-Output "> Running Win11Debloat..."
# Minimize the powershell window when no parameters are provided
if ($arguments.Count -eq 0) {
$windowStyle = "Minimized"
}
else {
$windowStyle = "Normal"
}
# Run Win11Debloat script with the provided arguments # Run Win11Debloat script with the provided arguments
$debloatProcess = Start-Process powershell.exe -PassThru -ArgumentList "-executionpolicy bypass -File $env:TEMP\Win11Debloat\Win11Debloat.ps1 $arguments" -Verb RunAs $debloatProcess = Start-Process powershell.exe -WindowStyle $windowStyle -PassThru -ArgumentList "-executionpolicy bypass -File $env:TEMP\Win11Debloat\Win11Debloat.ps1 $arguments" -Verb RunAs
# Wait for the process to finish before continuing # Wait for the process to finish before continuing
if ($null -ne $debloatProcess) { if ($null -ne $debloatProcess) {
@@ -154,7 +171,7 @@ if (Test-Path "$env:TEMP/Win11Debloat") {
Write-Output "> Cleaning up..." Write-Output "> Cleaning up..."
# Cleanup, remove Win11Debloat directory # Cleanup, remove Win11Debloat directory
Get-ChildItem -Path "$env:TEMP/Win11Debloat" -Exclude CustomAppsList,LastUsedSettings.json,Win11Debloat.log | Remove-Item -Recurse -Force Get-ChildItem -Path "$env:TEMP/Win11Debloat" -Exclude CustomAppsList,LastUsedSettings.json,Win11Debloat.log,Logs | Remove-Item -Recurse -Force
} }
Write-Output "" Write-Output ""

File diff suppressed because it is too large Load Diff