mirror of
https://github.com/Raphire/Win11Debloat.git
synced 2026-04-03 14:06:27 +00:00
Compare commits
33 Commits
2026.02.15
...
2026.03.07
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
238a48d39b | ||
|
|
9afd4ee02e | ||
|
|
70f8170e81 | ||
|
|
ad0b49060a | ||
|
|
bbfbd7193e | ||
|
|
495762e378 | ||
|
|
7c3af36e06 | ||
|
|
c72e4fcb54 | ||
|
|
8956c41b4d | ||
|
|
33ce8d6f70 | ||
|
|
a1907c2a78 | ||
|
|
b5b67290de | ||
|
|
d25960de64 | ||
|
|
ea67435f64 | ||
|
|
a611e6b128 | ||
|
|
033fa1b8af | ||
|
|
1b6aa00bdd | ||
|
|
7d00b84a07 | ||
|
|
15775d9dc8 | ||
|
|
2cb9f41db1 | ||
|
|
e496aa3af0 | ||
|
|
b355706cee | ||
|
|
810fb3be43 | ||
|
|
9500c2099e | ||
|
|
d172a0ef0c | ||
|
|
c76c3ce7ac | ||
|
|
2c940ff489 | ||
|
|
e0e69c0ef5 | ||
|
|
c9ce72f79a | ||
|
|
397eba7ca8 | ||
|
|
bffa6dfc3e | ||
|
|
754c3cee4c | ||
|
|
f47b0531a4 |
54
Apps.json
54
Apps.json
@@ -73,6 +73,18 @@
|
||||
"Description": "AI assistant integrated into Windows",
|
||||
"SelectedByDefault": true
|
||||
},
|
||||
{
|
||||
"FriendlyName": "Copilot+ AI Hub",
|
||||
"AppId": "Microsoft.Windows.AIHub",
|
||||
"Description": "Copilot+ AI Hub app (Windows 11 24H2+)",
|
||||
"SelectedByDefault": true
|
||||
},
|
||||
{
|
||||
"FriendlyName": "Microsoft PC Manager",
|
||||
"AppId": "Microsoft.PCManager",
|
||||
"Description": "Microsoft PC Manager system cleanup and optimization tool (often preinstalled)",
|
||||
"SelectedByDefault": true
|
||||
},
|
||||
{
|
||||
"FriendlyName": "Get Started",
|
||||
"AppId": "Microsoft.Getstarted",
|
||||
@@ -236,15 +248,15 @@
|
||||
"SelectedByDefault": true
|
||||
},
|
||||
{
|
||||
"FriendlyName": "MS Teams (Old)",
|
||||
"FriendlyName": "Microsoft Teams (Old)",
|
||||
"AppId": "MicrosoftTeams",
|
||||
"Description": "Old MS Teams personal (MS Store version)",
|
||||
"Description": "Old Microsoft Teams personal (MS Store version)",
|
||||
"SelectedByDefault": true
|
||||
},
|
||||
{
|
||||
"FriendlyName": "MS Teams (New)",
|
||||
"FriendlyName": "Microsoft Teams (New)",
|
||||
"AppId": "MSTeams",
|
||||
"Description": "New MS Teams app (Work/School or Personal)",
|
||||
"Description": "New Microsoft Teams app (Work/School or Personal)",
|
||||
"SelectedByDefault": true
|
||||
},
|
||||
{
|
||||
@@ -544,7 +556,7 @@
|
||||
{
|
||||
"FriendlyName": "Microsoft Edge",
|
||||
"AppId": "Microsoft.Edge",
|
||||
"Description": "Edge browser (Can only be uninstalled in European Economic Area)",
|
||||
"Description": "Windows' default browser. WARNING: Removing this app also removes the only browser from Windows Sandbox and could affect other apps.",
|
||||
"SelectedByDefault": false
|
||||
},
|
||||
{
|
||||
@@ -664,7 +676,7 @@
|
||||
{
|
||||
"FriendlyName": "Xbox TCUI Framework",
|
||||
"AppId": "Microsoft.Xbox.TCUI",
|
||||
"Description": "UI framework, seems to be required for MS store, photos and certain games",
|
||||
"Description": "UI framework, seems to be required for Microsoft Store, photos and certain games",
|
||||
"SelectedByDefault": false
|
||||
},
|
||||
{
|
||||
@@ -828,6 +840,36 @@
|
||||
"AppId": "AD2F1837.myHP",
|
||||
"Description": "HP OEM central hub app for device info, support, and services",
|
||||
"SelectedByDefault": false
|
||||
},
|
||||
{
|
||||
"FriendlyName": "Lenovo Vantage",
|
||||
"AppId": "E046963F.LenovoCompanion",
|
||||
"Description": "Lenovo OEM hub app for device settings, updates, and support",
|
||||
"SelectedByDefault": false
|
||||
},
|
||||
{
|
||||
"FriendlyName": "Lenovo Vantage Service",
|
||||
"AppId": "LenovoCompanyLimited.LenovoVantageService",
|
||||
"Description": "Background service component for Lenovo Vantage",
|
||||
"SelectedByDefault": false
|
||||
},
|
||||
{
|
||||
"FriendlyName": "Dell SupportAssist",
|
||||
"AppId": "DellInc.DellSupportAssistforPCs",
|
||||
"Description": "Dell OEM support, diagnostic, and update tool",
|
||||
"SelectedByDefault": false
|
||||
},
|
||||
{
|
||||
"FriendlyName": "Dell Digital Delivery Services",
|
||||
"AppId": "DellInc.DellDigitalDelivery",
|
||||
"Description": "Dell OEM software for delivering pre-purchased software",
|
||||
"SelectedByDefault": false
|
||||
},
|
||||
{
|
||||
"FriendlyName": "Dell Mobile Connect",
|
||||
"AppId": "DellInc.DellMobileConnect",
|
||||
"Description": "Dell OEM app for linking Android/iOS phone to PC (superseded by Phone Link)",
|
||||
"SelectedByDefault": false
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
"Icon": ""
|
||||
},
|
||||
{
|
||||
"Name": "Start Menu",
|
||||
"Name": "Start Menu & Search",
|
||||
"Icon": ""
|
||||
},
|
||||
{
|
||||
@@ -33,17 +33,21 @@
|
||||
"Name": "File Explorer",
|
||||
"Icon": ""
|
||||
},
|
||||
{
|
||||
"Name": "Gaming",
|
||||
"Icon": ""
|
||||
},
|
||||
{
|
||||
"Name": "Multi-tasking",
|
||||
"Icon": ""
|
||||
},
|
||||
{
|
||||
"Name": "Other",
|
||||
"Icon": ""
|
||||
"Name": "Optional Windows Features",
|
||||
"Icon": ""
|
||||
},
|
||||
{
|
||||
"Name": "Gaming",
|
||||
"Icon": ""
|
||||
"Name": "Other",
|
||||
"Icon": ""
|
||||
}
|
||||
],
|
||||
"UiGroups": [
|
||||
@@ -162,10 +166,11 @@
|
||||
"GroupId": "ClearStart",
|
||||
"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 & Search",
|
||||
"Priority": 1,
|
||||
"Values": [
|
||||
{
|
||||
"Label": "Remove for the current user",
|
||||
"Label": "Remove for the selected user",
|
||||
"FeatureIds": [
|
||||
"ClearStart"
|
||||
]
|
||||
@@ -344,11 +349,11 @@
|
||||
{
|
||||
"FeatureId": "DisableTelemetry",
|
||||
"Label": "telemetry, tracking & targeted ads",
|
||||
"ToolTip": "This settings disables telemetry, diagnostic data collection, activity history, app-launch tracking and targeted ads. This limits the data that is sent to Microsoft about your device and usage.",
|
||||
"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",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Telemetry.reg",
|
||||
"ApplyText": "> Disabling telemetry, diagnostic data, activity history, app-launch tracking and targeted ads...",
|
||||
"ApplyText": "Disabling telemetry, diagnostic data, activity history, app-launch tracking and targeted ads...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Telemetry.reg",
|
||||
"MinVersion": null,
|
||||
@@ -357,16 +362,42 @@
|
||||
{
|
||||
"FeatureId": "DisableSuggestions",
|
||||
"Label": "tips, tricks & suggested content throughout Windows",
|
||||
"ToolTip": "This will disable various tips, tricks, suggestions and ads throughout Windows.",
|
||||
"ToolTip": "This setting removes many annoying distractions from Windows. This includes things like notifications, reminders and sync provider ads. It also prevents automated installation of suggested apps.",
|
||||
"Category": "Privacy & Suggested Content",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Windows_Suggestions.reg",
|
||||
"ApplyText": "> Disabling tips, tricks, suggestions and ads throughout Windows...",
|
||||
"ApplyText": "Disabling tips, tricks, suggestions and ads throughout Windows...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Windows_Suggestions.reg",
|
||||
"MinVersion": null,
|
||||
"MaxVersion": null
|
||||
},
|
||||
{
|
||||
"FeatureId": "DisableLocationServices",
|
||||
"Label": "Windows location services & app location access",
|
||||
"ToolTip": "This will turn off Windows Location Services and deny apps access to your location. This feature uses policies, which will lock down certain settings.",
|
||||
"Category": "Privacy & Suggested Content",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Location_Services.reg",
|
||||
"ApplyText": "Disabling Windows location services and app location access...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Location_Services.reg",
|
||||
"MinVersion": null,
|
||||
"MaxVersion": null
|
||||
},
|
||||
{
|
||||
"FeatureId": "DisableFindMyDevice",
|
||||
"Label": "Find My Device location tracking",
|
||||
"ToolTip": "This will turn off the 'Find My Device' feature, which periodically sends your device's location to Microsoft. This feature uses policies, which will lock down certain settings.",
|
||||
"Category": "Privacy & Suggested Content",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Find_My_Device.reg",
|
||||
"ApplyText": "> Disabling Find My Device location tracking...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Find_My_Device.reg",
|
||||
"MinVersion": null,
|
||||
"MaxVersion": null
|
||||
},
|
||||
{
|
||||
"FeatureId": "DisableLockscreenTips",
|
||||
"Label": "tips & tricks on the lock screen",
|
||||
@@ -374,7 +405,7 @@
|
||||
"Category": "Privacy & Suggested Content",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Lockscreen_Tips.reg",
|
||||
"ApplyText": "> Disabling tips & tricks on the lock screen...",
|
||||
"ApplyText": "Disabling tips & tricks on the lock screen...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Lockscreen_Tips.reg",
|
||||
"MinVersion": null,
|
||||
@@ -387,7 +418,7 @@
|
||||
"Category": "Privacy & Suggested Content",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Desktop_Spotlight.reg",
|
||||
"ApplyText": "> Disabling the 'Windows Spotlight' desktop background option...",
|
||||
"ApplyText": "Disabling the 'Windows Spotlight' desktop background option...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Desktop_Spotlight.reg",
|
||||
"MinVersion": null,
|
||||
@@ -396,11 +427,11 @@
|
||||
{
|
||||
"FeatureId": "DisableEdgeAds",
|
||||
"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.",
|
||||
"ToolTip": "This will turn off various distractions from Microsoft Edge such as ads, suggestions and the MSN news feed. This feature uses policies, which will lock down certain settings.",
|
||||
"Category": "Privacy & Suggested Content",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Edge_Ads_And_Suggestions.reg",
|
||||
"ApplyText": "> Disabling ads, suggestions and the MSN news feed in Microsoft Edge...",
|
||||
"ApplyText": "Disabling ads, suggestions and the MSN news feed in Microsoft Edge...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Edge_Ads_And_Suggestions.reg",
|
||||
"MinVersion": null,
|
||||
@@ -409,11 +440,11 @@
|
||||
{
|
||||
"FeatureId": "DisableCopilot",
|
||||
"Label": "Microsoft Copilot",
|
||||
"ToolTip": "This will turn off and uninstall Microsoft Copilot, the AI assistant integrated throughout Windows.",
|
||||
"ToolTip": "This will disable and uninstall Microsoft Copilot, Windows' built-in AI assistant.",
|
||||
"Category": "AI",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Copilot.reg",
|
||||
"ApplyText": "> Disabling Microsoft Copilot...",
|
||||
"ApplyText": "Disabling Microsoft Copilot...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Copilot.reg",
|
||||
"MinVersion": 22621,
|
||||
@@ -422,11 +453,11 @@
|
||||
{
|
||||
"FeatureId": "DisableRecall",
|
||||
"Label": "Windows Recall",
|
||||
"ToolTip": "This will turn off Windows Recall, an AI-powered feature that provides quick access to recently used files, apps and activities.",
|
||||
"ToolTip": "This will disable Windows Recall, an AI-powered feature that provides quick access to recently used files, apps and activities. This feature uses policies, which will lock down certain settings.",
|
||||
"Category": "AI",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_AI_Recall.reg",
|
||||
"ApplyText": "> Disabling Windows Recall...",
|
||||
"ApplyText": "Disabling Windows Recall...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_AI_Recall.reg",
|
||||
"MinVersion": 22621,
|
||||
@@ -435,24 +466,37 @@
|
||||
{
|
||||
"FeatureId": "DisableClickToDo",
|
||||
"Label": "Click To Do, AI text & image analysis",
|
||||
"ToolTip": "This will turn off Click To Do, which provides AI-powered text and image analysis features in Windows.",
|
||||
"ToolTip": "This will disable Click To Do, which provides AI-powered text and image analysis features in Windows. This feature uses policies, which will lock down certain settings.",
|
||||
"Category": "AI",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Click_to_Do.reg",
|
||||
"ApplyText": "> Disabling Click to Do...",
|
||||
"ApplyText": "Disabling Click to Do...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Click_to_Do.reg",
|
||||
"MinVersion": 22621,
|
||||
"MaxVersion": null
|
||||
},
|
||||
{
|
||||
"FeatureId": "DisableAISvcAutoStart",
|
||||
"Label": "AI service from starting automatically",
|
||||
"ToolTip": "This will set the WSAIFabricSvc service to manual startup, preventing the service from starting automatically with Windows.",
|
||||
"Category": "AI",
|
||||
"Action": "Prevent",
|
||||
"RegistryKey": "Disable_AI_Service_Auto_Start.reg",
|
||||
"ApplyText": "> Preventing AI service from starting automatically...",
|
||||
"UndoAction": "Allow",
|
||||
"RegistryUndoKey": "Enable_AI_Service_Auto_Start.reg",
|
||||
"MinVersion": 22621,
|
||||
"MaxVersion": null
|
||||
},
|
||||
{
|
||||
"FeatureId": "DisableDVR",
|
||||
"Label": "Xbox game/screen recording",
|
||||
"ToolTip": "This will turn off the Xbox game/screen recording features included with the Game Bar app.",
|
||||
"ToolTip": "This will disable the Xbox game/screen recording features included with the Game Bar app. This feature uses policies, which will lock down certain settings.",
|
||||
"Category": "Gaming",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_DVR.reg",
|
||||
"ApplyText": "> Disabling Xbox game/screen recording...",
|
||||
"ApplyText": "Disabling Xbox game/screen recording...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_DVR.reg",
|
||||
"MinVersion": null,
|
||||
@@ -461,11 +505,11 @@
|
||||
{
|
||||
"FeatureId": "DisableGameBarIntegration",
|
||||
"Label": "Game Bar integration",
|
||||
"ToolTip": "This will turn off the Game Bar integration features such as the Game Bar overlay that appears when pressing Win+G.",
|
||||
"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",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Game_Bar_Integration.reg",
|
||||
"ApplyText": "> Disabling Game Bar integration...",
|
||||
"ApplyText": "Disabling Game Bar integration...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Game_Bar_Integration.reg",
|
||||
"MinVersion": null,
|
||||
@@ -475,7 +519,7 @@
|
||||
"FeatureId": "ClearStart",
|
||||
"Action": "Clear Start Menu",
|
||||
"Label": "Remove all pinned apps from the start menu for this user only",
|
||||
"Category": "Start Menu",
|
||||
"Category": "Start Menu & Search",
|
||||
"RegistryKey": null,
|
||||
"ApplyText": null,
|
||||
"UndoAction": null,
|
||||
@@ -487,7 +531,7 @@
|
||||
"FeatureId": "ClearStartAllUsers",
|
||||
"Action": "Clear Start Menu (All Users)",
|
||||
"Label": "Remove all pinned apps from the start menu for all existing and new users",
|
||||
"Category": "Start Menu",
|
||||
"Category": "Start Menu & Search",
|
||||
"RegistryKey": null,
|
||||
"ApplyText": null,
|
||||
"UndoAction": null,
|
||||
@@ -522,42 +566,81 @@
|
||||
{
|
||||
"FeatureId": "DisableStartRecommended",
|
||||
"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",
|
||||
"ToolTip": "This will hide the recommended section in the start menu, which shows recently added apps, recently opened files and app recommendations. This feature uses policies, which will lock down certain settings.",
|
||||
"Category": "Start Menu & Search",
|
||||
"Action": "Hide",
|
||||
"RegistryKey": "Disable_Start_Recommended.reg",
|
||||
"ApplyText": "> Disabling the start menu recommended section...",
|
||||
"ApplyText": "Disabling the start menu recommended section...",
|
||||
"UndoAction": "Show",
|
||||
"RegistryUndoKey": "Enable_Start_Recommended.reg",
|
||||
"MinVersion": 22621,
|
||||
"MaxVersion": null
|
||||
},
|
||||
{
|
||||
"FeatureId": "DisableStartPhoneLink",
|
||||
"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 & Search",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Phone_Link_In_Start.reg",
|
||||
"ApplyText": "Disabling the Phone Link mobile devices integration in the start menu...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Phone_Link_In_Start.reg",
|
||||
"MinVersion": 22621,
|
||||
"MaxVersion": null
|
||||
},
|
||||
{
|
||||
"FeatureId": "DisableBing",
|
||||
"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",
|
||||
"Label": "Bing web search & Copilot integration in search",
|
||||
"ToolTip": "This will turn off Bing web search results and Copilot integration in the Windows search experience. This feature uses policies, which will lock down certain settings.",
|
||||
"Category": "Start Menu & Search",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Bing_Cortana_In_Search.reg",
|
||||
"ApplyText": "> Disabling Bing web search & Copilot integration in Windows search...",
|
||||
"ApplyText": "Disabling Bing web search & Copilot integration in Windows search...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Bing_Cortana_In_Search.reg",
|
||||
"MinVersion": null,
|
||||
"MaxVersion": null
|
||||
},
|
||||
{
|
||||
"FeatureId": "DisableStartPhoneLink",
|
||||
"Label": "Phone Link integration in the start menu",
|
||||
"ToolTip": "This will remove the Phone Link integration that appears in the start menu when you have a mobile device linked to your PC.",
|
||||
"Category": "Start Menu",
|
||||
"FeatureId": "DisableStoreSearchSuggestions",
|
||||
"Label": "Microsoft Store app suggestions in search",
|
||||
"ToolTip": "This will disable the Microsoft Store app suggestions in Windows search.",
|
||||
"Category": "Start Menu & Search",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Phone_Link_In_Start.reg",
|
||||
"ApplyText": "> Disabling the Phone Link mobile devices integration in the start menu...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Phone_Link_In_Start.reg",
|
||||
"RegistryKey": null,
|
||||
"ApplyText": null,
|
||||
"UndoAction": null,
|
||||
"RegistryUndoKey": null,
|
||||
"MinVersion": 22621,
|
||||
"MaxVersion": null
|
||||
},
|
||||
{
|
||||
"FeatureId": "DisableSearchHighlights",
|
||||
"Label": "Search Highlights in the taskbar search box",
|
||||
"ToolTip": "This will turn off Search Highlights, which shows dynamically curated branded content and trending topics in the Windows search box on the taskbar.",
|
||||
"Category": "Start Menu & Search",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Search_Highlights.reg",
|
||||
"ApplyText": "> Disabling Search Highlights in the Windows search box...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Search_Highlights.reg",
|
||||
"MinVersion": 22621,
|
||||
"MaxVersion": null
|
||||
},
|
||||
{
|
||||
"FeatureId": "DisableSearchHistory",
|
||||
"Label": "local Windows Search history",
|
||||
"ToolTip": "This setting disables local search history in Windows Search. This does not affect web search history or the search history saved in Microsoft Edge.",
|
||||
"Category": "Start Menu & Search",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Search_History.reg",
|
||||
"ApplyText": "Disabling search history...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Search_History.reg",
|
||||
"MinVersion": null,
|
||||
"MaxVersion": null
|
||||
},
|
||||
{
|
||||
"FeatureId": "DisableSettings365Ads",
|
||||
"Label": "Microsoft 365 Copilot ads in Settings Home",
|
||||
@@ -565,7 +648,7 @@
|
||||
"Category": "Privacy & Suggested Content",
|
||||
"Action": "Hide",
|
||||
"RegistryKey": "Disable_Settings_365_Ads.reg",
|
||||
"ApplyText": "> Disabling Microsoft 365 Copilot ads in Settings Home...",
|
||||
"ApplyText": "Disabling Microsoft 365 Copilot ads in Settings Home...",
|
||||
"UndoAction": "Show",
|
||||
"RegistryUndoKey": "Enable_Settings_365_Ads.reg",
|
||||
"MinVersion": null,
|
||||
@@ -578,7 +661,7 @@
|
||||
"Category": "Other",
|
||||
"Action": "Hide",
|
||||
"RegistryKey": "Disable_Settings_Home.reg",
|
||||
"ApplyText": "> Disabling the Settings Home page...",
|
||||
"ApplyText": "Disabling the Settings Home page...",
|
||||
"UndoAction": "Show",
|
||||
"RegistryUndoKey": "Enable_Settings_Home.reg",
|
||||
"MinVersion": null,
|
||||
@@ -587,11 +670,11 @@
|
||||
{
|
||||
"FeatureId": "DisableEdgeAI",
|
||||
"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.",
|
||||
"ToolTip": "This will turn off AI features in Microsoft Edge, such as the AI-powered sidebar and Copilot features. This feature uses policies, which will lock down certain settings.",
|
||||
"Category": "AI",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Edge_AI_Features.reg",
|
||||
"ApplyText": "> Disabling AI features in Microsoft Edge...",
|
||||
"ApplyText": "Disabling AI features in Microsoft Edge...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Edge_AI_Features.reg",
|
||||
"MinVersion": 22621,
|
||||
@@ -600,11 +683,11 @@
|
||||
{
|
||||
"FeatureId": "DisablePaintAI",
|
||||
"Label": "AI features in Paint",
|
||||
"ToolTip": "This will turn off AI features in Paint, such as the AI-powered image generation and editing tools.",
|
||||
"ToolTip": "This will turn off AI features in Paint, such as the AI-powered image generation and editing tools. This feature uses policies, which will lock down certain settings.",
|
||||
"Category": "AI",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Paint_AI_Features.reg",
|
||||
"ApplyText": "> Disabling AI features in Paint...",
|
||||
"ApplyText": "Disabling AI features in Paint...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Paint_AI_Features.reg",
|
||||
"MinVersion": 22621,
|
||||
@@ -613,11 +696,11 @@
|
||||
{
|
||||
"FeatureId": "DisableNotepadAI",
|
||||
"Label": "AI features in Notepad",
|
||||
"ToolTip": "This will turn off AI features in Notepad, such as the AI-powered writing suggestions.",
|
||||
"ToolTip": "This will turn off AI features in Notepad, such as the AI-powered writing suggestions. This feature uses policies, which will lock down certain settings.",
|
||||
"Category": "AI",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Notepad_AI_Features.reg",
|
||||
"ApplyText": "> Disabling AI features in Notepad...",
|
||||
"ApplyText": "Disabling AI features in Notepad...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Notepad_AI_Features.reg",
|
||||
"MinVersion": 22621,
|
||||
@@ -626,11 +709,11 @@
|
||||
{
|
||||
"FeatureId": "EnableDarkMode",
|
||||
"Label": "theme for system and apps",
|
||||
"ToolTip": "This will set the default app mode and system theme to dark mode, which changes the appearance of Windows and supported apps.",
|
||||
"ToolTip": "This will set the app and system theme to dark mode.",
|
||||
"Category": "Appearance",
|
||||
"Action": "Enable dark",
|
||||
"RegistryKey": "Enable_Dark_Mode.reg",
|
||||
"ApplyText": "> Enabling dark mode for system and apps...",
|
||||
"ApplyText": "Enabling dark mode for system and apps...",
|
||||
"UndoAction": "Disable light",
|
||||
"RegistryUndoKey": "Enable_Light_Mode.reg",
|
||||
"MinVersion": null,
|
||||
@@ -643,7 +726,7 @@
|
||||
"Category": "System",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Share_Drag_Tray.reg",
|
||||
"ApplyText": "> Disabling Drag Tray...",
|
||||
"ApplyText": "Disabling Drag Tray...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Share_Drag_Tray.reg",
|
||||
"MinVersion": 26200,
|
||||
@@ -652,11 +735,11 @@
|
||||
{
|
||||
"FeatureId": "RevertContextMenu",
|
||||
"Label": "context menu style",
|
||||
"ToolTip": "This will restore the classic Windows 10 style context menu instead of the modern Windows 11 style menu.",
|
||||
"ToolTip": "This will restore the classic Windows 10 style context menu, which is normally hidden behind the 'Show more options' entry in the new Windows 11 context menu.",
|
||||
"Category": "System",
|
||||
"Action": "Use classic Windows 10",
|
||||
"RegistryKey": "Disable_Show_More_Options_Context_Menu.reg",
|
||||
"ApplyText": "> Restoring the classic Windows 10 style context menu...",
|
||||
"ApplyText": "Restoring the classic Windows 10 style context menu...",
|
||||
"UndoAction": "Use modern Windows 11",
|
||||
"RegistryUndoKey": "Enable_W11_Style_Context_Menu.reg",
|
||||
"MinVersion": 22000,
|
||||
@@ -665,13 +748,14 @@
|
||||
{
|
||||
"FeatureId": "DisableMouseAcceleration",
|
||||
"Label": "Enhance Pointer Precision (mouse acceleration)",
|
||||
"ToolTip": "By default, Windows has a mouse acceleration enabled, which can make the mouse movement less predictable, especially for gaming. Disabling this will make the mouse movement more consistent.",
|
||||
"ToolTip": "This will disable mouse acceleration which is enabled by default in Windows. This makes mouse movement more consistent and predictable.",
|
||||
"Category": "System",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Enhance_Pointer_Precision.reg",
|
||||
"ApplyText": "> Turning off Enhanced Pointer Precision...",
|
||||
"ApplyText": "Turning off Enhanced Pointer Precision...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Enhance_Pointer_Precision.reg",
|
||||
"RequiresReboot": true,
|
||||
"MinVersion": null,
|
||||
"MaxVersion": null
|
||||
},
|
||||
@@ -682,9 +766,10 @@
|
||||
"Category": "System",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Sticky_Keys_Shortcut.reg",
|
||||
"ApplyText": "> Disabling the Sticky Keys keyboard shortcut...",
|
||||
"ApplyText": "Disabling the Sticky Keys keyboard shortcut...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Sticky_Keys_Shortcut.reg",
|
||||
"RequiresReboot": true,
|
||||
"MinVersion": 26100,
|
||||
"MaxVersion": null
|
||||
},
|
||||
@@ -696,7 +781,7 @@
|
||||
"Priority": 1,
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Window_Snapping.reg",
|
||||
"ApplyText": "> Disabling window snapping...",
|
||||
"ApplyText": "Disabling window snapping...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Window_Snapping.reg",
|
||||
"MinVersion": null,
|
||||
@@ -710,7 +795,7 @@
|
||||
"Priority": 2,
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Snap_Assist.reg",
|
||||
"ApplyText": "> Disabling the Snap Assist suggestions...",
|
||||
"ApplyText": "Disabling the Snap Assist suggestions...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Snap_Assist.reg",
|
||||
"MinVersion": 22000,
|
||||
@@ -724,7 +809,7 @@
|
||||
"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...",
|
||||
"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,
|
||||
@@ -736,7 +821,7 @@
|
||||
"Category": "Multi-tasking",
|
||||
"Action": "Hide",
|
||||
"RegistryKey": "Hide_Tabs_In_Alt_Tab.reg",
|
||||
"ApplyText": "> Disable showing tabs from apps when snapping or pressing Alt+Tab...",
|
||||
"ApplyText": "Disable showing tabs from apps when snapping or pressing Alt+Tab...",
|
||||
"UndoAction": null,
|
||||
"RegistryUndoKey": null,
|
||||
"MinVersion": 22000,
|
||||
@@ -748,7 +833,7 @@
|
||||
"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...",
|
||||
"ApplyText": "Enable showing 3 tabs from apps when snapping or pressing Alt+Tab...",
|
||||
"UndoAction": null,
|
||||
"RegistryUndoKey": null,
|
||||
"MinVersion": 22000,
|
||||
@@ -760,7 +845,7 @@
|
||||
"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...",
|
||||
"ApplyText": "Enable showing 5 tabs from apps when snapping or pressing Alt+Tab...",
|
||||
"UndoAction": null,
|
||||
"RegistryUndoKey": null,
|
||||
"MinVersion": 22000,
|
||||
@@ -772,7 +857,7 @@
|
||||
"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...",
|
||||
"ApplyText": "Enable showing 20 tabs from apps when snapping or pressing Alt+Tab...",
|
||||
"UndoAction": null,
|
||||
"RegistryUndoKey": null,
|
||||
"MinVersion": 22000,
|
||||
@@ -781,12 +866,12 @@
|
||||
{
|
||||
"FeatureId": "TaskbarAlignLeft",
|
||||
"Label": "taskbar alignment",
|
||||
"ToolTip": "By default, Windows 11 has the taskbar buttons centered. Enabling this will align the taskbar buttons to the left, similar to previous versions of Windows.",
|
||||
"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",
|
||||
"Priority": 1,
|
||||
"Action": "Left",
|
||||
"RegistryKey": "Align_Taskbar_Left.reg",
|
||||
"ApplyText": "> Aligning taskbar buttons to the left...",
|
||||
"ApplyText": "Aligning taskbar buttons to the left...",
|
||||
"UndoAction": "Center",
|
||||
"RegistryUndoKey": "Align_Taskbar_Center.reg",
|
||||
"MinVersion": 22000,
|
||||
@@ -798,7 +883,7 @@
|
||||
"Category": "Taskbar",
|
||||
"Action": "Hide Search",
|
||||
"RegistryKey": "Hide_Search_Taskbar.reg",
|
||||
"ApplyText": "> Hiding the search icon from the taskbar...",
|
||||
"ApplyText": "Hiding the search icon from the taskbar...",
|
||||
"UndoAction": "Show Search Box",
|
||||
"RegistryUndoKey": "Show_Search_Box.reg",
|
||||
"MinVersion": 22000,
|
||||
@@ -809,8 +894,8 @@
|
||||
"Label": "Show search icon on the taskbar",
|
||||
"Category": "Taskbar",
|
||||
"Action": "Show Search Icon",
|
||||
"RegistryKey": "Show_Search_Box.reg",
|
||||
"ApplyText": "> Changing taskbar search to icon only...",
|
||||
"RegistryKey": "Show_Search_Icon.reg",
|
||||
"ApplyText": "Changing taskbar search to icon only...",
|
||||
"UndoAction": "Show Search Box",
|
||||
"RegistryUndoKey": "Show_Search_Box.reg",
|
||||
"MinVersion": 22000,
|
||||
@@ -821,8 +906,8 @@
|
||||
"Label": "Show search icon with label on the taskbar",
|
||||
"Category": "Taskbar",
|
||||
"Action": "Show Search Label",
|
||||
"RegistryKey": "Show_Search_Box.reg",
|
||||
"ApplyText": "> Changing taskbar search to icon with label...",
|
||||
"RegistryKey": "Show_Search_Icon_And_Label.reg",
|
||||
"ApplyText": "Changing taskbar search to icon with label...",
|
||||
"UndoAction": "Show Search Box",
|
||||
"RegistryUndoKey": "Show_Search_Box.reg",
|
||||
"MinVersion": 22000,
|
||||
@@ -834,7 +919,7 @@
|
||||
"Category": "Taskbar",
|
||||
"Action": "Show Search Box",
|
||||
"RegistryKey": "Show_Search_Box.reg",
|
||||
"ApplyText": "> Changing taskbar search to search box...",
|
||||
"ApplyText": "Changing taskbar search to search box...",
|
||||
"UndoAction": null,
|
||||
"RegistryUndoKey": null,
|
||||
"MinVersion": 22000,
|
||||
@@ -848,7 +933,7 @@
|
||||
"Priority": 3,
|
||||
"Action": "Hide",
|
||||
"RegistryKey": "Hide_Taskview_Taskbar.reg",
|
||||
"ApplyText": "> Hiding the taskview button from the taskbar...",
|
||||
"ApplyText": "Hiding the taskview button from the taskbar...",
|
||||
"UndoAction": "Show",
|
||||
"RegistryUndoKey": "Show_Taskview_Taskbar.reg",
|
||||
"MinVersion": 22000,
|
||||
@@ -857,12 +942,12 @@
|
||||
{
|
||||
"FeatureId": "DisableWidgets",
|
||||
"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.",
|
||||
"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. This feature uses policies, which will lock down certain settings.",
|
||||
"Category": "Taskbar",
|
||||
"Priority": 4,
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Widgets_Service.reg",
|
||||
"ApplyText": "> Disabling widgets on the taskbar & lock screen...",
|
||||
"ApplyText": "Disabling widgets on the taskbar & lock screen...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Widgets_Service.reg",
|
||||
"MinVersion": null,
|
||||
@@ -876,12 +961,25 @@
|
||||
"Priority": 5,
|
||||
"Action": "Hide",
|
||||
"RegistryKey": "Disable_Chat_Taskbar.reg",
|
||||
"ApplyText": "> Hiding the chat icon from the taskbar...",
|
||||
"ApplyText": "Hiding the chat icon from the taskbar...",
|
||||
"UndoAction": "Show",
|
||||
"RegistryUndoKey": "Enable_Chat_Taskbar.reg",
|
||||
"MinVersion": null,
|
||||
"MaxVersion": 22621
|
||||
},
|
||||
{
|
||||
"FeatureId": "DisableStorageSense",
|
||||
"Label": "Storage Sense automatic disk cleanup",
|
||||
"ToolTip": "This will disable Storage Sense, which automatically frees up disk space by deleting temporary files, emptying the recycle bin and cleaning up files in the Downloads folder.",
|
||||
"Category": "System",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Storage_Sense.reg",
|
||||
"ApplyText": "Disabling Storage Sense automatic disk cleanup...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Storage_Sense.reg",
|
||||
"MinVersion": 22000,
|
||||
"MaxVersion": null
|
||||
},
|
||||
{
|
||||
"FeatureId": "DisableFastStartup",
|
||||
"Label": "fast start-up",
|
||||
@@ -889,7 +987,7 @@
|
||||
"Category": "System",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Fast_Startup.reg",
|
||||
"ApplyText": "> Disabling Fast Start-up...",
|
||||
"ApplyText": "Disabling Fast Start-up...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Fast_Startup.reg",
|
||||
"MinVersion": null,
|
||||
@@ -902,7 +1000,7 @@
|
||||
"Category": "System",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Bitlocker_Auto_Encryption.reg",
|
||||
"ApplyText": "> Disabling BitLocker automatic device encryption...",
|
||||
"ApplyText": "Disabling BitLocker automatic device encryption...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Bitlocker_Auto_Encryption.reg",
|
||||
"MinVersion": 22000,
|
||||
@@ -911,11 +1009,11 @@
|
||||
{
|
||||
"FeatureId": "DisableModernStandbyNetworking",
|
||||
"Label": "Modern Standby network connectivity",
|
||||
"ToolTip": "By default, devices that support Modern Standby maintain network connectivity while in sleep mode to allow for features like receiving calls or messages while asleep. Disabling network connectivity during Modern Standby can help save battery life.",
|
||||
"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",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Modern_Standby_Networking.reg",
|
||||
"ApplyText": "> Disabling network connectivity during Modern Standby...",
|
||||
"ApplyText": "Disabling network connectivity during Modern Standby...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Modern_Standby_Networking.reg",
|
||||
"MinVersion": 22000,
|
||||
@@ -924,12 +1022,12 @@
|
||||
{
|
||||
"FeatureId": "EnableEndTask",
|
||||
"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 without opening Task Manager.",
|
||||
"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",
|
||||
"Priority": 6,
|
||||
"Action": "Show",
|
||||
"RegistryKey": "Enable_End_Task.reg",
|
||||
"ApplyText": "> Enabling the 'End Task' option in the taskbar right click menu...",
|
||||
"ApplyText": "Enabling the 'End Task' option in the taskbar right click menu...",
|
||||
"UndoAction": "Hide",
|
||||
"RegistryUndoKey": "Disable_End_Task.reg",
|
||||
"MinVersion": 22631,
|
||||
@@ -938,12 +1036,12 @@
|
||||
{
|
||||
"FeatureId": "EnableLastActiveClick",
|
||||
"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 showing the thumbnail preview.",
|
||||
"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",
|
||||
"Priority": 7,
|
||||
"Action": "Enable",
|
||||
"RegistryKey": "Enable_Last_Active_Click.reg",
|
||||
"ApplyText": "> Enabling the 'Last Active Click' behavior in the taskbar app area...",
|
||||
"ApplyText": "Enabling the 'Last Active Click' behavior in the taskbar app area...",
|
||||
"UndoAction": "Disable",
|
||||
"RegistryUndoKey": "Disable_Last_Active_Click.reg",
|
||||
"MinVersion": 22000,
|
||||
@@ -955,7 +1053,7 @@
|
||||
"Category": "Taskbar",
|
||||
"Action": "Combine Taskbar Always",
|
||||
"RegistryKey": "Combine_Taskbar_Always.reg",
|
||||
"ApplyText": "> Setting the taskbar on the main display to always combine buttons and hide labels...",
|
||||
"ApplyText": "Setting the taskbar on the main display to always combine buttons and hide labels...",
|
||||
"UndoAction": null,
|
||||
"RegistryUndoKey": null,
|
||||
"MinVersion": 22000,
|
||||
@@ -967,7 +1065,7 @@
|
||||
"Category": "Taskbar",
|
||||
"Action": "Combine Multi-Monitor Taskbar Always",
|
||||
"RegistryKey": "Combine_MMTaskbar_Always.reg",
|
||||
"ApplyText": "> Setting the taskbar on secondary displays to always combine buttons and hide labels...",
|
||||
"ApplyText": "Setting the taskbar on secondary displays to always combine buttons and hide labels...",
|
||||
"UndoAction": null,
|
||||
"RegistryUndoKey": null,
|
||||
"MinVersion": 22000,
|
||||
@@ -979,7 +1077,7 @@
|
||||
"Category": "Taskbar",
|
||||
"Action": "Combine Taskbar When Full",
|
||||
"RegistryKey": "Combine_Taskbar_When_Full.reg",
|
||||
"ApplyText": "> Setting the taskbar on the main display to only combine buttons and hide labels when the taskbar is full...",
|
||||
"ApplyText": "Setting the taskbar on the main display to only combine buttons and hide labels when the taskbar is full...",
|
||||
"UndoAction": "Combine Taskbar Always",
|
||||
"RegistryUndoKey": "Combine_Taskbar_Always.reg",
|
||||
"MinVersion": 22000,
|
||||
@@ -991,7 +1089,7 @@
|
||||
"Category": "Taskbar",
|
||||
"Action": "Combine Multi-Monitor Taskbar When Full",
|
||||
"RegistryKey": "Combine_MMTaskbar_When_Full.reg",
|
||||
"ApplyText": "> Setting the taskbar on secondary displays to only combine buttons and hide labels when the taskbar is full...",
|
||||
"ApplyText": "Setting the taskbar on secondary displays to only combine buttons and hide labels when the taskbar is full...",
|
||||
"UndoAction": "Combine Multi-Monitor Taskbar Always",
|
||||
"RegistryUndoKey": "Combine_MMTaskbar_Always.reg",
|
||||
"MinVersion": 22000,
|
||||
@@ -1003,7 +1101,7 @@
|
||||
"Category": "Taskbar",
|
||||
"Action": "Never Combine Taskbar",
|
||||
"RegistryKey": "Combine_Taskbar_Never.reg",
|
||||
"ApplyText": "> Setting the taskbar on the main display to never combine buttons or hide labels...",
|
||||
"ApplyText": "Setting the taskbar on the main display to never combine buttons or hide labels...",
|
||||
"UndoAction": "Combine Taskbar Always",
|
||||
"RegistryUndoKey": "Combine_Taskbar_Always.reg",
|
||||
"MinVersion": 22000,
|
||||
@@ -1015,7 +1113,7 @@
|
||||
"Category": "Taskbar",
|
||||
"Action": "Never Combine Multi-Monitor Taskbar",
|
||||
"RegistryKey": "Combine_MMTaskbar_Never.reg",
|
||||
"ApplyText": "> Setting the taskbar on secondary displays to never combine buttons or hide labels...",
|
||||
"ApplyText": "Setting the taskbar on secondary displays to never combine buttons or hide labels...",
|
||||
"UndoAction": "Combine Multi-Monitor Taskbar Always",
|
||||
"RegistryUndoKey": "Combine_MMTaskbar_Always.reg",
|
||||
"MinVersion": 22000,
|
||||
@@ -1027,7 +1125,7 @@
|
||||
"Category": "Taskbar",
|
||||
"Action": "Show All Taskbar Icons",
|
||||
"RegistryKey": "MMTaskbarMode_All.reg",
|
||||
"ApplyText": "> Setting the taskbar to show app icons on all taskbars...",
|
||||
"ApplyText": "Setting the taskbar to show app icons on all taskbars...",
|
||||
"UndoAction": null,
|
||||
"RegistryUndoKey": null,
|
||||
"MinVersion": 22000,
|
||||
@@ -1039,7 +1137,7 @@
|
||||
"Category": "Taskbar",
|
||||
"Action": "Show Taskbar Icons Main + Active",
|
||||
"RegistryKey": "MMTaskbarMode_Main_Active.reg",
|
||||
"ApplyText": "> Setting the taskbar to show app icons on main taskbar and on taskbar where the windows is open...",
|
||||
"ApplyText": "Setting the taskbar to show app icons on main taskbar and on taskbar where the windows is open...",
|
||||
"UndoAction": "Show All Taskbar Icons",
|
||||
"RegistryUndoKey": "MMTaskbarMode_All.reg",
|
||||
"MinVersion": 22000,
|
||||
@@ -1051,7 +1149,7 @@
|
||||
"Category": "Taskbar",
|
||||
"Action": "Show Taskbar Icons Active Only",
|
||||
"RegistryKey": "MMTaskbarMode_Active.reg",
|
||||
"ApplyText": "> Setting the taskbar to only show app icons on the taskbar where the window is open...",
|
||||
"ApplyText": "Setting the taskbar to only show app icons on the taskbar where the window is open...",
|
||||
"UndoAction": "Show All Taskbar Icons",
|
||||
"RegistryUndoKey": "MMTaskbarMode_All.reg",
|
||||
"MinVersion": 22000,
|
||||
@@ -1063,7 +1161,7 @@
|
||||
"Category": "File Explorer",
|
||||
"Action": "Explorer to Home",
|
||||
"RegistryKey": "Launch_File_Explorer_To_Home.reg",
|
||||
"ApplyText": "> Changing the default location that File Explorer opens to, to 'Home'...",
|
||||
"ApplyText": "Changing the default location that File Explorer opens to, to 'Home'...",
|
||||
"UndoAction": null,
|
||||
"RegistryUndoKey": null,
|
||||
"MinVersion": null,
|
||||
@@ -1075,7 +1173,7 @@
|
||||
"Category": "File Explorer",
|
||||
"Action": "Explorer to This PC",
|
||||
"RegistryKey": "Launch_File_Explorer_To_This_PC.reg",
|
||||
"ApplyText": "> Changing the default location that File Explorer opens to, to 'This PC'...",
|
||||
"ApplyText": "Changing the default location that File Explorer opens to, to 'This PC'...",
|
||||
"UndoAction": "Explorer to Home",
|
||||
"RegistryUndoKey": "Launch_File_Explorer_To_Home.reg",
|
||||
"MinVersion": null,
|
||||
@@ -1087,7 +1185,7 @@
|
||||
"Category": "File Explorer",
|
||||
"Action": "Explorer to Downloads",
|
||||
"RegistryKey": "Launch_File_Explorer_To_Downloads.reg",
|
||||
"ApplyText": "> Changing the default location that File Explorer opens to, to 'Downloads'...",
|
||||
"ApplyText": "Changing the default location that File Explorer opens to, to 'Downloads'...",
|
||||
"UndoAction": "Explorer to Home",
|
||||
"RegistryUndoKey": "Launch_File_Explorer_To_Home.reg",
|
||||
"MinVersion": null,
|
||||
@@ -1099,7 +1197,7 @@
|
||||
"Category": "File Explorer",
|
||||
"Action": "Explorer to OneDrive",
|
||||
"RegistryKey": "Launch_File_Explorer_To_OneDrive.reg",
|
||||
"ApplyText": "> Changing the default location that File Explorer opens to, to 'OneDrive'...",
|
||||
"ApplyText": "Changing the default location that File Explorer opens to, to 'OneDrive'...",
|
||||
"UndoAction": "Explorer to Home",
|
||||
"RegistryUndoKey": "Launch_File_Explorer_To_Home.reg",
|
||||
"MinVersion": null,
|
||||
@@ -1112,7 +1210,7 @@
|
||||
"Category": "File Explorer",
|
||||
"Action": "Show",
|
||||
"RegistryKey": "Show_Extensions_For_Known_File_Types.reg",
|
||||
"ApplyText": "> Enabling file extensions for known file types...",
|
||||
"ApplyText": "Enabling file extensions for known file types...",
|
||||
"UndoAction": "Hide",
|
||||
"RegistryUndoKey": "Hide_Extensions_For_Known_File_Types.reg",
|
||||
"MinVersion": null,
|
||||
@@ -1121,11 +1219,11 @@
|
||||
{
|
||||
"FeatureId": "ShowHiddenFolders",
|
||||
"Label": "hidden files, folders and drives",
|
||||
"ToolTip": "By default, Windows hides certain files, folders and drives to prevent accidental modification or deletion. Enabling this will show hidden files, folders and drives in File Explorer.",
|
||||
"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",
|
||||
"Action": "Show",
|
||||
"RegistryKey": "Show_Hidden_Folders.reg",
|
||||
"ApplyText": "> Unhiding hidden files, folders and drives...",
|
||||
"ApplyText": "Unhiding hidden files, folders and drives...",
|
||||
"UndoAction": "Hide",
|
||||
"RegistryUndoKey": "Hide_Hidden_Folders.reg",
|
||||
"MinVersion": null,
|
||||
@@ -1138,7 +1236,7 @@
|
||||
"Category": "File Explorer",
|
||||
"Action": "Hide",
|
||||
"RegistryKey": "Hide_Home_from_Explorer.reg",
|
||||
"ApplyText": "> Hiding the home section from the File Explorer navigation pane...",
|
||||
"ApplyText": "Hiding the home section from the File Explorer navigation pane...",
|
||||
"UndoAction": "Show",
|
||||
"RegistryUndoKey": "Show_Home_in_Explorer.reg",
|
||||
"MinVersion": 22000,
|
||||
@@ -1151,7 +1249,7 @@
|
||||
"Category": "File Explorer",
|
||||
"Action": "Hide",
|
||||
"RegistryKey": "Hide_Gallery_from_Explorer.reg",
|
||||
"ApplyText": "> Hiding the gallery section from the File Explorer navigation pane...",
|
||||
"ApplyText": "Hiding the gallery section from the File Explorer navigation pane...",
|
||||
"UndoAction": "Show",
|
||||
"RegistryUndoKey": "Show_Gallery_in_Explorer.reg",
|
||||
"MinVersion": 22000,
|
||||
@@ -1160,11 +1258,11 @@
|
||||
{
|
||||
"FeatureId": "HideDupliDrive",
|
||||
"Label": "duplicate removable drive entries",
|
||||
"ToolTip": "When you connect a removable drive, Windows shows the drive both under 'This PC' and in the navigation pane with its own entry. Hiding duplicate removable drive entries will only show the drive under 'This PC' and remove it from the navigation pane.",
|
||||
"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",
|
||||
"Action": "Hide",
|
||||
"RegistryKey": "Hide_duplicate_removable_drives_from_navigation_pane_of_File_Explorer.reg",
|
||||
"ApplyText": "> Hiding duplicate removable drive entries from the File Explorer navigation pane...",
|
||||
"ApplyText": "Hiding duplicate removable drive entries from the File Explorer navigation pane...",
|
||||
"UndoAction": "Show",
|
||||
"RegistryUndoKey": "Show_duplicate_removable_drives_in_navigation_pane_of_File_Explorer.reg",
|
||||
"MinVersion": null,
|
||||
@@ -1177,7 +1275,7 @@
|
||||
"Category": "File Explorer",
|
||||
"Action": "Add",
|
||||
"RegistryKey": "Add_All_Folders_Under_This_PC.reg",
|
||||
"ApplyText": "> Adding all common folders (Desktop, Downloads, etc.) back to 'This PC' in File Explorer...",
|
||||
"ApplyText": "Adding all common folders (Desktop, Downloads, etc.) back to 'This PC' in File Explorer...",
|
||||
"UndoAction": "Remove",
|
||||
"RegistryUndoKey": "Remove_All_Folders_Under_This_PC.reg",
|
||||
"MinVersion": 22000,
|
||||
@@ -1190,7 +1288,7 @@
|
||||
"Category": "Appearance",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Transparency.reg",
|
||||
"ApplyText": "> Disabling transparency effects...",
|
||||
"ApplyText": "Disabling transparency effects...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Transparency.reg",
|
||||
"MinVersion": null,
|
||||
@@ -1199,13 +1297,14 @@
|
||||
{
|
||||
"FeatureId": "DisableAnimations",
|
||||
"Label": "animations and visual effects",
|
||||
"ToolTip": "This will disable animations and some visual effects in Windows, which can make the interface feel snappier and more responsive, especially on older hardware.",
|
||||
"ToolTip": "This will disable animations and some visual effects in Windows, which can make the interface feel snappier, especially on older hardware.",
|
||||
"Category": "Appearance",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Animations.reg",
|
||||
"ApplyText": "> Disabling animations and visual effects...",
|
||||
"ApplyText": "Disabling animations and visual effects...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Animations.reg",
|
||||
"RequiresReboot": true,
|
||||
"MinVersion": null,
|
||||
"MaxVersion": null
|
||||
},
|
||||
@@ -1216,7 +1315,7 @@
|
||||
"Category": "Windows Update",
|
||||
"Action": "Prevent getting",
|
||||
"RegistryKey": "Disable_Update_ASAP.reg",
|
||||
"ApplyText": "> Preventing Windows from getting updates as soon as they are available...",
|
||||
"ApplyText": "Preventing Windows from getting updates as soon as they are available...",
|
||||
"UndoAction": "Get",
|
||||
"RegistryUndoKey": "Enable_Update_ASAP.reg",
|
||||
"MinVersion": null,
|
||||
@@ -1229,7 +1328,7 @@
|
||||
"Category": "Windows Update",
|
||||
"Action": "Prevent",
|
||||
"RegistryKey": "Prevent_Auto_Reboot.reg",
|
||||
"ApplyText": "> Preventing automatic restarts after updates while signed in...",
|
||||
"ApplyText": "Preventing automatic restarts after updates while signed in...",
|
||||
"UndoAction": "Allow",
|
||||
"RegistryUndoKey": "Allow_Auto_Reboot.reg",
|
||||
"MinVersion": null,
|
||||
@@ -1242,7 +1341,7 @@
|
||||
"Category": "Windows Update",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Delivery_Optimization.reg",
|
||||
"ApplyText": "> Disabling sharing of downloaded updates with other PCs...",
|
||||
"ApplyText": "Disabling sharing of downloaded updates with other PCs...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Delivery_Optimization.reg",
|
||||
"MinVersion": null,
|
||||
@@ -1267,7 +1366,7 @@
|
||||
"Category": "File Explorer",
|
||||
"Action": "Hide",
|
||||
"RegistryKey": "Disable_Include_in_library_from_context_menu.reg",
|
||||
"ApplyText": "> Hiding 'Include in library' in the context menu...",
|
||||
"ApplyText": "Hiding 'Include in library' in the context menu...",
|
||||
"UndoAction": "Show",
|
||||
"RegistryUndoKey": "Enable_Include_in_library_in_context_menu.reg",
|
||||
"MinVersion": null,
|
||||
@@ -1280,7 +1379,7 @@
|
||||
"Category": "File Explorer",
|
||||
"Action": "Hide",
|
||||
"RegistryKey": "Disable_Give_access_to_context_menu.reg",
|
||||
"ApplyText": "> Hiding 'Give access to' in the context menu...",
|
||||
"ApplyText": "Hiding 'Give access to' in the context menu...",
|
||||
"UndoAction": "Show",
|
||||
"RegistryUndoKey": "Enable_Give_access_to_context_menu.reg",
|
||||
"MinVersion": null,
|
||||
@@ -1293,7 +1392,7 @@
|
||||
"Category": "File Explorer",
|
||||
"Action": "Hide",
|
||||
"RegistryKey": "Disable_Share_from_context_menu.reg",
|
||||
"ApplyText": "> Hiding 'Share' in the context menu...",
|
||||
"ApplyText": "Hiding 'Share' in the context menu...",
|
||||
"UndoAction": "Show",
|
||||
"RegistryUndoKey": "Enable_Share_in_context_menu.reg",
|
||||
"MinVersion": null,
|
||||
@@ -1306,7 +1405,7 @@
|
||||
"Category": "File Explorer",
|
||||
"Action": "Hide",
|
||||
"RegistryKey": "Hide_Onedrive_Folder.reg",
|
||||
"ApplyText": "> Hiding the OneDrive folder from the File Explorer navigation pane...",
|
||||
"ApplyText": "Hiding the OneDrive folder from the File Explorer navigation pane...",
|
||||
"UndoAction": "Show",
|
||||
"RegistryUndoKey": "Show_Onedrive_Folder.reg",
|
||||
"MinVersion": null,
|
||||
@@ -1319,7 +1418,7 @@
|
||||
"Category": "File Explorer",
|
||||
"Action": "Hide",
|
||||
"RegistryKey": "Hide_3D_Objects_Folder.reg",
|
||||
"ApplyText": "> Hiding the 3D objects folder from the File Explorer navigation pane...",
|
||||
"ApplyText": "Hiding the 3D objects folder from the File Explorer navigation pane...",
|
||||
"UndoAction": "Show",
|
||||
"RegistryUndoKey": "Show_3D_Objects_Folder.reg",
|
||||
"MinVersion": null,
|
||||
@@ -1332,7 +1431,7 @@
|
||||
"Category": "File Explorer",
|
||||
"Action": "Hide",
|
||||
"RegistryKey": "Hide_Music_Folder.reg",
|
||||
"ApplyText": "> Hiding the music folder from the File Explorer navigation pane...",
|
||||
"ApplyText": "Hiding the music folder from the File Explorer navigation pane...",
|
||||
"UndoAction": "Show",
|
||||
"RegistryUndoKey": "Show_Music_Folder.reg",
|
||||
"MinVersion": null,
|
||||
@@ -1341,15 +1440,43 @@
|
||||
{
|
||||
"FeatureId": "DisableBraveBloat",
|
||||
"Label": "bloat in Brave browser (AI, Crypto, etc.)",
|
||||
"ToolTip": "This will turn off Brave's built-in AI features, Crypto wallet, News, Rewards, Talk and VPN.",
|
||||
"ToolTip": "This will disable Brave's built-in AI features, Crypto wallet, News, Rewards, Talk and VPN. This feature uses policies, which will lock down certain settings.",
|
||||
"Category": "Other",
|
||||
"Action": "Disable",
|
||||
"RegistryKey": "Disable_Brave_Bloat.reg",
|
||||
"ApplyText": "> Disabling Brave AI, Crypto, News, Rewards, Talk and VPN in Brave browser...",
|
||||
"ApplyText": "Disabling Brave AI, Crypto, News, Rewards, Talk and VPN in Brave browser...",
|
||||
"UndoAction": "Enable",
|
||||
"RegistryUndoKey": "Enable_Brave_Bloat.reg",
|
||||
"MinVersion": null,
|
||||
"MaxVersion": null
|
||||
},
|
||||
{
|
||||
"FeatureId": "EnableWindowsSandbox",
|
||||
"Label": "Windows Sandbox",
|
||||
"ToolTip": "Windows Sandbox is a lightweight desktop environment for safely running applications in isolation. Software installed inside the Windows Sandbox environment remains 'sandboxed' and runs separately from the host machine. Only supported on Windows 11 Pro, Workstation, and Enterprise editions.",
|
||||
"Category": "Optional Windows Features",
|
||||
"Action": "Enable",
|
||||
"RegistryKey": null,
|
||||
"ApplyText": "Enabling Windows Sandbox...",
|
||||
"UndoAction": null,
|
||||
"RegistryUndoKey": null,
|
||||
"RequiresReboot": true,
|
||||
"MinVersion": 22483,
|
||||
"MaxVersion": null
|
||||
},
|
||||
{
|
||||
"FeatureId": "EnableWindowsSubsystemForLinux",
|
||||
"Label": "Windows Subsystem for Linux",
|
||||
"ToolTip": "Windows Subsystem for Linux allows you to run a Linux environment directly on Windows without the need for a virtual machine.",
|
||||
"Category": "Optional Windows Features",
|
||||
"Action": "Enable",
|
||||
"RegistryKey": null,
|
||||
"ApplyText": "Enabling Windows Subsystem for Linux...",
|
||||
"UndoAction": null,
|
||||
"RegistryUndoKey": null,
|
||||
"RequiresReboot": true,
|
||||
"MinVersion": 22000,
|
||||
"MaxVersion": null
|
||||
}
|
||||
]
|
||||
}
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 51 KiB |
@@ -25,6 +25,14 @@
|
||||
"Name": "DisableBing",
|
||||
"Value": true
|
||||
},
|
||||
{
|
||||
"Name": "DisableStoreSearchSuggestions",
|
||||
"Value": true
|
||||
},
|
||||
{
|
||||
"Name": "DisableSearchHighlights",
|
||||
"Value": true
|
||||
},
|
||||
{
|
||||
"Name": "DisableCopilot",
|
||||
"Value": true
|
||||
@@ -37,6 +45,10 @@
|
||||
"Name": "DisableClickToDo",
|
||||
"Value": true
|
||||
},
|
||||
{
|
||||
"Name": "DisableAISvcAutoStart",
|
||||
"Value": true
|
||||
},
|
||||
{
|
||||
"Name": "DisableWidgets",
|
||||
"Value": true
|
||||
|
||||
16
README.md
16
README.md
@@ -87,6 +87,8 @@ Below is an overview of the key features and functionality offered by Win11Deblo
|
||||
|
||||
- Disable telemetry, diagnostic data, activity history, app-launch tracking & targeted ads.
|
||||
- Disable tips, tricks, suggestions & ads across Windows.
|
||||
- Disable Windows location services & app location access.
|
||||
- Disable Find My Device location tracking.
|
||||
- Disable 'Windows Spotlight' and tips & tricks on the lock screen.
|
||||
- Disable 'Windows Spotlight' desktop background option.
|
||||
- Disable ads, suggestions and the MSN news feed in Microsoft Edge.
|
||||
@@ -97,6 +99,7 @@ Below is an overview of the key features and functionality offered by Win11Deblo
|
||||
- Disable & remove Microsoft Copilot.
|
||||
- Disable Windows Recall. (W11 only)
|
||||
- Disable Click to Do, AI text & image analysis tool. (W11 only)
|
||||
- Prevent AI service (WSAIFabricSvc) from starting automatically. (W11 only)
|
||||
- Disable AI Features in Edge. (W11 only)
|
||||
- Disable AI Features in Paint. (W11 only)
|
||||
- Disable AI Features in Notepad. (W11 only)
|
||||
@@ -107,6 +110,7 @@ Below is an overview of the key features and functionality offered by Win11Deblo
|
||||
- Restore the old Windows 10 style context menu. (W11 only)
|
||||
- Turn off Enhance Pointer Precision, also known as mouse acceleration.
|
||||
- Disable the Sticky Keys keyboard shortcut. (W11 only)
|
||||
- Disable Storage Sense automatic disk cleanup.
|
||||
- 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)
|
||||
@@ -123,12 +127,15 @@ Below is an overview of the key features and functionality offered by Win11Deblo
|
||||
- Disable transparency effects
|
||||
- Disable animations and visual effects.
|
||||
|
||||
#### Start Menu
|
||||
#### Start Menu & Search
|
||||
|
||||
- Remove or replace all pinned apps from start for the current user, or for all existing & new users. (W11 only)
|
||||
- Disable the recommended section in the start menu. (W11 only)
|
||||
- Disable Bing web search & Copilot integration in Windows search.
|
||||
- Disable the Phone Link mobile devices integration in the start menu. (W11 only)
|
||||
- Disable Bing web search & Copilot integration in Windows search.
|
||||
- Disable Microsoft Store app suggestions in Windows search. (W11 only)
|
||||
- Disable Search Highlights (dynamic/branded content) in the taskbar search box. (W11 only)
|
||||
- Disable local Windows search history.
|
||||
|
||||
#### Taskbar
|
||||
|
||||
@@ -160,6 +167,11 @@ Below is an overview of the key features and functionality offered by Win11Deblo
|
||||
- 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)
|
||||
|
||||
#### Optional Windows Features
|
||||
|
||||
- Enable Windows Sandbox, a lightweight desktop environment for safely running applications in isolation. (W11 only)
|
||||
- Enable Windows Subsystem for Linux which allows you to run a Linux environment directly on Windows. (W11 only)
|
||||
|
||||
#### Other
|
||||
|
||||
- Disable Xbox Game Bar integration & game/screen recording. This also disables `ms-gamingoverlay`/`ms-gamebar` popups if you uninstall the Xbox Game Bar.
|
||||
|
||||
4
Regfiles/Disable_AI_Service_Auto_Start.reg
Normal file
4
Regfiles/Disable_AI_Service_Auto_Start.reg
Normal file
@@ -0,0 +1,4 @@
|
||||
Windows Registry Editor Version 5.00
|
||||
|
||||
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WSAIFabricSvc]
|
||||
"Start"=dword:00000003
|
||||
5
Regfiles/Disable_Find_My_Device.reg
Normal file
5
Regfiles/Disable_Find_My_Device.reg
Normal file
@@ -0,0 +1,5 @@
|
||||
Windows Registry Editor Version 5.00
|
||||
|
||||
; Disable Find My Device location tracking
|
||||
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\FindMyDevice]
|
||||
"AllowFindMyDevice"=dword:00000000
|
||||
4
Regfiles/Disable_Location_Services.reg
Normal file
4
Regfiles/Disable_Location_Services.reg
Normal file
@@ -0,0 +1,4 @@
|
||||
Windows Registry Editor Version 5.00
|
||||
|
||||
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\LocationAndSensors]
|
||||
"DisableLocation"=dword:00000001
|
||||
5
Regfiles/Disable_Search_Highlights.reg
Normal file
5
Regfiles/Disable_Search_Highlights.reg
Normal file
@@ -0,0 +1,5 @@
|
||||
Windows Registry Editor Version 5.00
|
||||
|
||||
; Disable Search Highlights (dynamic/branded content in Windows search box)
|
||||
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\SearchSettings]
|
||||
"IsDynamicSearchBoxEnabled"=dword:00000000
|
||||
5
Regfiles/Disable_Search_History.reg
Normal file
5
Regfiles/Disable_Search_History.reg
Normal file
@@ -0,0 +1,5 @@
|
||||
Windows Registry Editor Version 5.00
|
||||
|
||||
; Disable Windows search history
|
||||
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\SearchSettings]
|
||||
"IsDeviceSearchHistoryEnabled"=dword:00000000
|
||||
5
Regfiles/Disable_Storage_Sense.reg
Normal file
5
Regfiles/Disable_Storage_Sense.reg
Normal file
@@ -0,0 +1,5 @@
|
||||
Windows Registry Editor Version 5.00
|
||||
|
||||
; Disable Storage Sense
|
||||
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\StorageSense\Parameters\StoragePolicy]
|
||||
"01"=dword:00000000
|
||||
4
Regfiles/Sysprep/Disable_AI_Service_Auto_Start.reg
Normal file
4
Regfiles/Sysprep/Disable_AI_Service_Auto_Start.reg
Normal file
@@ -0,0 +1,4 @@
|
||||
Windows Registry Editor Version 5.00
|
||||
|
||||
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WSAIFabricSvc]
|
||||
"Start"=dword:00000003
|
||||
5
Regfiles/Sysprep/Disable_Find_My_Device.reg
Normal file
5
Regfiles/Sysprep/Disable_Find_My_Device.reg
Normal file
@@ -0,0 +1,5 @@
|
||||
Windows Registry Editor Version 5.00
|
||||
|
||||
; Disable Find My Device location tracking
|
||||
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\FindMyDevice]
|
||||
"AllowFindMyDevice"=dword:00000000
|
||||
4
Regfiles/Sysprep/Disable_Location_Services.reg
Normal file
4
Regfiles/Sysprep/Disable_Location_Services.reg
Normal file
@@ -0,0 +1,4 @@
|
||||
Windows Registry Editor Version 5.00
|
||||
|
||||
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\LocationAndSensors]
|
||||
"DisableLocation"=dword:00000001
|
||||
5
Regfiles/Sysprep/Disable_Search_Highlights.reg
Normal file
5
Regfiles/Sysprep/Disable_Search_Highlights.reg
Normal file
@@ -0,0 +1,5 @@
|
||||
Windows Registry Editor Version 5.00
|
||||
|
||||
; Disable Search Highlights (dynamic/branded content in Windows search box)
|
||||
[hkey_users\default\Software\Microsoft\Windows\CurrentVersion\SearchSettings]
|
||||
"IsDynamicSearchBoxEnabled"=dword:00000000
|
||||
5
Regfiles/Sysprep/Disable_Search_History.reg
Normal file
5
Regfiles/Sysprep/Disable_Search_History.reg
Normal file
@@ -0,0 +1,5 @@
|
||||
Windows Registry Editor Version 5.00
|
||||
|
||||
; Disable Windows search history
|
||||
[hkey_users\default\Software\Microsoft\Windows\CurrentVersion\SearchSettings]
|
||||
"IsDeviceSearchHistoryEnabled"=dword:00000000
|
||||
6
Regfiles/Sysprep/Disable_Storage_Sense.reg
Normal file
6
Regfiles/Sysprep/Disable_Storage_Sense.reg
Normal file
@@ -0,0 +1,6 @@
|
||||
Windows Registry Editor Version 5.00
|
||||
|
||||
; Disable Storage Sense
|
||||
[HKEY_USERS\Default\SOFTWARE\Microsoft\Windows\CurrentVersion\StorageSense\Parameters\StoragePolicy]
|
||||
"01"=dword:00000000
|
||||
|
||||
4
Regfiles/Undo/Enable_AI_Service_Auto_Start.reg
Normal file
4
Regfiles/Undo/Enable_AI_Service_Auto_Start.reg
Normal file
@@ -0,0 +1,4 @@
|
||||
Windows Registry Editor Version 5.00
|
||||
|
||||
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WSAIFabricSvc]
|
||||
"Start"=dword:00000002
|
||||
5
Regfiles/Undo/Enable_Find_My_Device.reg
Normal file
5
Regfiles/Undo/Enable_Find_My_Device.reg
Normal file
@@ -0,0 +1,5 @@
|
||||
Windows Registry Editor Version 5.00
|
||||
|
||||
; Restore Find My Device to Windows default
|
||||
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\FindMyDevice]
|
||||
"AllowFindMyDevice"=-
|
||||
4
Regfiles/Undo/Enable_Location_Services.reg
Normal file
4
Regfiles/Undo/Enable_Location_Services.reg
Normal file
@@ -0,0 +1,4 @@
|
||||
Windows Registry Editor Version 5.00
|
||||
|
||||
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\LocationAndSensors]
|
||||
"DisableLocation"=-
|
||||
5
Regfiles/Undo/Enable_Search_Highlights.reg
Normal file
5
Regfiles/Undo/Enable_Search_Highlights.reg
Normal file
@@ -0,0 +1,5 @@
|
||||
Windows Registry Editor Version 5.00
|
||||
|
||||
; Re-enable Search Highlights (dynamic/branded content in Windows search box)
|
||||
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\SearchSettings]
|
||||
"IsDynamicSearchBoxEnabled"=dword:00000001
|
||||
5
Regfiles/Undo/Enable_Search_History.reg
Normal file
5
Regfiles/Undo/Enable_Search_History.reg
Normal file
@@ -0,0 +1,5 @@
|
||||
Windows Registry Editor Version 5.00
|
||||
|
||||
; Disable Windows search history
|
||||
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\SearchSettings]
|
||||
"IsDeviceSearchHistoryEnabled"=dword:00000001
|
||||
6
Regfiles/Undo/Enable_Storage_Sense.reg
Normal file
6
Regfiles/Undo/Enable_Storage_Sense.reg
Normal file
@@ -0,0 +1,6 @@
|
||||
Windows Registry Editor Version 5.00
|
||||
|
||||
; Enable Storage Sense
|
||||
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\StorageSense\Parameters\StoragePolicy]
|
||||
"01"=dword:00000001
|
||||
|
||||
@@ -4,96 +4,12 @@
|
||||
Width="500"
|
||||
SizeToContent="Height"
|
||||
ResizeMode="NoResize"
|
||||
WindowStartupLocation="CenterScreen"
|
||||
WindowStartupLocation="CenterOwner"
|
||||
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"
|
||||
@@ -183,7 +99,7 @@
|
||||
Grid.Row="2" Grid.Column="1"
|
||||
Text="https://github.com/Raphire/Win11Debloat"
|
||||
FontSize="14"
|
||||
Style="{StaticResource HyperlinkStyle}"
|
||||
Style="{DynamicResource HyperlinkStyle}"
|
||||
Margin="0,0,0,0"/>
|
||||
</Grid>
|
||||
|
||||
@@ -212,7 +128,7 @@
|
||||
<TextBlock x:Name="KofiLinkIcon"
|
||||
Grid.Column="0"
|
||||
FontSize="16"
|
||||
Style="{StaticResource HyperlinkStyle}"
|
||||
Style="{DynamicResource HyperlinkStyle}"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
FontWeight="SemiBold"
|
||||
@@ -224,7 +140,7 @@
|
||||
<TextBlock x:Name="KofiLink"
|
||||
Grid.Column="1"
|
||||
FontSize="16"
|
||||
Style="{StaticResource HyperlinkStyle}"
|
||||
Style="{DynamicResource HyperlinkStyle}"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
FontWeight="SemiBold"
|
||||
@@ -245,7 +161,8 @@
|
||||
HorizontalAlignment="Right">
|
||||
<Button x:Name="CloseButton"
|
||||
Content="Close"
|
||||
Style="{StaticResource MessageBoxButton}"/>
|
||||
Height="32" MinWidth="80" Margin="4,0"
|
||||
Style="{DynamicResource SecondaryButtonStyle}"/>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</Grid>
|
||||
|
||||
@@ -9,43 +9,6 @@
|
||||
Background="Transparent"
|
||||
Foreground="{DynamicResource FgColor}">
|
||||
<Window.Resources>
|
||||
<!-- ScrollBar Style -->
|
||||
<Style TargetType="{x:Type ScrollBar}">
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Setter Property="Width" Value="8"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="{x:Type ScrollBar}">
|
||||
<Grid>
|
||||
<Track Name="PART_Track" IsDirectionReversed="true">
|
||||
<Track.Thumb>
|
||||
<Thumb>
|
||||
<Thumb.Style>
|
||||
<Style TargetType="Thumb">
|
||||
<Setter Property="Background" Value="{DynamicResource ScrollBarThumbColor}"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="Thumb">
|
||||
<Border Background="{TemplateBinding Background}" CornerRadius="4"/>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
<Style.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter Property="Background" Value="{DynamicResource ScrollBarThumbHoverColor}"/>
|
||||
</Trigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</Thumb.Style>
|
||||
</Thumb>
|
||||
</Track.Thumb>
|
||||
</Track>
|
||||
</Grid>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<!-- CheckBox Style -->
|
||||
<Style TargetType="CheckBox">
|
||||
<Setter Property="Foreground" Value="{DynamicResource FgColor}"/>
|
||||
@@ -94,84 +57,6 @@
|
||||
<Style x:Key="AppsPanelCheckBoxStyle" TargetType="CheckBox" BasedOn="{StaticResource {x:Type CheckBox}}">
|
||||
<Setter Property="Margin" Value="2,3,2,3"/>
|
||||
</Style>
|
||||
|
||||
<!-- Button Style -->
|
||||
<Style x:Key="Win11Button" TargetType="Button">
|
||||
<Setter Property="Background" Value="{DynamicResource ButtonBg}"/>
|
||||
<Setter Property="Foreground" Value="white"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource ButtonBg}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="Padding" Value="0"/>
|
||||
<Setter Property="FontSize" Value="14"/>
|
||||
<Setter Property="Cursor" Value="Hand"/>
|
||||
<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"/>
|
||||
</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>
|
||||
|
||||
<!-- Secondary Button Style -->
|
||||
<Style x:Key="Win11ButtonSecondary" TargetType="Button">
|
||||
<Setter Property="Background" Value="{DynamicResource SecondaryButtonBg}"/>
|
||||
<Setter Property="Foreground" Value="{DynamicResource FgColor}"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource ButtonBorderColor}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="Padding" Value="0"/>
|
||||
<Setter Property="FontSize" Value="14"/>
|
||||
<Setter Property="Cursor" Value="Hand"/>
|
||||
<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 SecondaryButtonDisabled}"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource BorderColor}"/>
|
||||
<Setter Property="Foreground" Value="{DynamicResource SecondaryButtonTextDisabled}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter Property="Background" Value="{DynamicResource SecondaryButtonHover}"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource ButtonBorderColor}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsPressed" Value="True">
|
||||
<Setter Property="Background" Value="{DynamicResource SecondaryButtonPressed}"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource ButtonBorderColor}"/>
|
||||
</Trigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
|
||||
<!-- Title Bar Button Style -->
|
||||
<Style x:Key="TitleBarButton" TargetType="Button">
|
||||
@@ -276,8 +161,8 @@
|
||||
<Grid Margin="0,8,10,10">
|
||||
<CheckBox x:Name="OnlyInstalledBox" Content="Only show installed apps" Foreground="{DynamicResource FgColor}" AutomationProperties.Name="Only show installed apps"/>
|
||||
</Grid>
|
||||
<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" AutomationProperties.Name="Cancel"/>
|
||||
<Button x:Name="ConfirmBtn" Width="80" Height="32" Margin="0,0,10,0" Content="Confirm" Style="{DynamicResource PrimaryButtonStyle}" AutomationProperties.Name="Confirm"/>
|
||||
<Button x:Name="CancelBtn" Width="80" Height="32" Content="Cancel" Style="{DynamicResource SecondaryButtonStyle}" IsCancel="True" AutomationProperties.Name="Cancel"/>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Grid>
|
||||
|
||||
203
Schemas/ApplyChangesWindow.xaml
Normal file
203
Schemas/ApplyChangesWindow.xaml
Normal file
@@ -0,0 +1,203 @@
|
||||
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
Title="Apply Changes"
|
||||
Width="500"
|
||||
SizeToContent="Height"
|
||||
ResizeMode="NoResize"
|
||||
WindowStartupLocation="CenterOwner"
|
||||
WindowStyle="None"
|
||||
AllowsTransparency="True"
|
||||
Background="Transparent"
|
||||
Topmost="True"
|
||||
ShowInTaskbar="False">
|
||||
|
||||
<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>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Close/Cancel button (top right) -->
|
||||
<Button x:Name="ApplyCancelBtn" Grid.Row="0"
|
||||
HorizontalAlignment="Right" VerticalAlignment="Top"
|
||||
Width="36" Height="32"
|
||||
BorderThickness="0"
|
||||
Cursor="Hand"
|
||||
ToolTip="Cancel"
|
||||
AutomationProperties.Name="Cancel">
|
||||
<Button.Template>
|
||||
<ControlTemplate TargetType="Button">
|
||||
<Border Background="{TemplateBinding Background}" BorderThickness="0" CornerRadius="0,8,0,0">
|
||||
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
|
||||
</Border>
|
||||
</ControlTemplate>
|
||||
</Button.Template>
|
||||
<Button.Style>
|
||||
<Style TargetType="Button">
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Setter Property="Foreground" Value="{DynamicResource FgColor}"/>
|
||||
<Style.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter Property="Background" Value="{DynamicResource CloseHover}"/>
|
||||
</Trigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</Button.Style>
|
||||
<TextBlock Text="" FontFamily="Segoe Fluent Icons" FontSize="10"/>
|
||||
</Button>
|
||||
|
||||
<StackPanel Grid.Row="0" Grid.RowSpan="2">
|
||||
<!-- In-progress content -->
|
||||
<StackPanel x:Name="ApplyInProgressPanel">
|
||||
<StackPanel Margin="32,24">
|
||||
<!-- Loading icon (spinning) -->
|
||||
<TextBlock x:Name="ApplySpinnerIcon"
|
||||
Text=""
|
||||
FontFamily="Segoe Fluent Icons"
|
||||
FontSize="36"
|
||||
Foreground="{DynamicResource ButtonBg}"
|
||||
HorizontalAlignment="Center"
|
||||
Margin="0,0,0,16"
|
||||
RenderTransformOrigin="0.5,0.5">
|
||||
<TextBlock.RenderTransform>
|
||||
<RotateTransform x:Name="SpinnerRotation" Angle="0"/>
|
||||
</TextBlock.RenderTransform>
|
||||
<TextBlock.Triggers>
|
||||
<EventTrigger RoutedEvent="Loaded">
|
||||
<BeginStoryboard>
|
||||
<Storyboard>
|
||||
<DoubleAnimation Storyboard.TargetName="SpinnerRotation"
|
||||
Storyboard.TargetProperty="Angle"
|
||||
From="0" To="360"
|
||||
Duration="0:0:1.5"
|
||||
RepeatBehavior="Forever"/>
|
||||
</Storyboard>
|
||||
</BeginStoryboard>
|
||||
</EventTrigger>
|
||||
</TextBlock.Triggers>
|
||||
</TextBlock>
|
||||
|
||||
<TextBlock Text="Applying Changes"
|
||||
Style="{DynamicResource ModalTitleStyle}"/>
|
||||
|
||||
<!-- Current step name -->
|
||||
<TextBlock x:Name="ApplyStepName"
|
||||
Text="Preparing..."
|
||||
Style="{DynamicResource ModalSubtextStyle}"
|
||||
TextTrimming="CharacterEllipsis"
|
||||
MaxWidth="430"/>
|
||||
</StackPanel>
|
||||
|
||||
<Border Background="{DynamicResource BgColor}"
|
||||
BorderBrush="{DynamicResource BorderColor}"
|
||||
BorderThickness="0,1,0,0"
|
||||
Padding="16,12"
|
||||
CornerRadius="0,0,8,8">
|
||||
<StackPanel>
|
||||
|
||||
<!-- Progress bar -->
|
||||
<ProgressBar x:Name="ApplyProgressBar"
|
||||
Style="{DynamicResource ApplyProgressBarStyle}"
|
||||
Minimum="0" Maximum="100" Value="0"
|
||||
Margin="0,2,0,8"/>
|
||||
|
||||
<!-- Step counter -->
|
||||
<TextBlock x:Name="ApplyStepCounter"
|
||||
Text="Step 0 of 0"
|
||||
FontSize="12"
|
||||
Foreground="{DynamicResource FgColor}"
|
||||
HorizontalAlignment="Right"
|
||||
Opacity="0.8"/>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Completion content -->
|
||||
<StackPanel x:Name="ApplyCompletionPanel" Visibility="Collapsed">
|
||||
<StackPanel Margin="32,24">
|
||||
<!-- Success icon -->
|
||||
<TextBlock x:Name="ApplyCompletionIcon"
|
||||
Text=""
|
||||
FontFamily="Segoe Fluent Icons"
|
||||
FontSize="40"
|
||||
Foreground="{DynamicResource ButtonBg}"
|
||||
HorizontalAlignment="Center"
|
||||
Margin="0,0,0,12"/>
|
||||
|
||||
<TextBlock x:Name="ApplyCompletionTitle"
|
||||
Text="Changes Applied"
|
||||
Style="{DynamicResource ModalTitleStyle}"/>
|
||||
|
||||
<TextBlock x:Name="ApplyCompletionMessage"
|
||||
Text="Please note that some changes will only take effect after a reboot. Thanks for using Win11Debloat!"
|
||||
TextWrapping="Wrap"
|
||||
Style="{DynamicResource ModalSubtextStyle}"/>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Reboot required section -->
|
||||
<Border x:Name="ApplyRebootPanel"
|
||||
Visibility="Collapsed"
|
||||
BorderBrush="{DynamicResource BorderColor}"
|
||||
HorizontalAlignment="Center"
|
||||
BorderThickness="0,1,0,1"
|
||||
Padding="24,12,24,14">
|
||||
<StackPanel>
|
||||
<StackPanel Orientation="Horizontal" Margin="0,0,0,6">
|
||||
<TextBlock Text=""
|
||||
FontFamily="Segoe Fluent Icons"
|
||||
FontSize="14"
|
||||
Foreground="#e8912d"
|
||||
VerticalAlignment="Center"
|
||||
Margin="0,0,8,0"/>
|
||||
<TextBlock Text="A reboot is required for these changes to take effect:"
|
||||
FontSize="13"
|
||||
FontWeight="SemiBold"
|
||||
Foreground="{DynamicResource FgColor}"
|
||||
VerticalAlignment="Center"/>
|
||||
</StackPanel>
|
||||
<StackPanel x:Name="ApplyRebootList" Margin="22,0,0,0"/>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<!-- Button Panel -->
|
||||
<Border 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="Center">
|
||||
<Button x:Name="ApplyKofiBtn" Width="210" Height="32"
|
||||
Style="{DynamicResource SecondaryButtonStyle}"
|
||||
Margin="0,0,12,0"
|
||||
AutomationProperties.Name="Support the creator">
|
||||
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
||||
<TextBlock Text="" FontFamily="Segoe Fluent Icons" FontSize="14" VerticalAlignment="Center" Margin="0,0,8,-1"/>
|
||||
<TextBlock Text="Support the creator" VerticalAlignment="Center" FontSize="14" Margin="0,0,0,1"/>
|
||||
</StackPanel>
|
||||
</Button>
|
||||
<Button x:Name="ApplyCloseBtn" Width="100" Height="32"
|
||||
Style="{DynamicResource PrimaryButtonStyle}"
|
||||
AutomationProperties.Name="Close">
|
||||
<TextBlock Text="Close" VerticalAlignment="Center" FontSize="14" Margin="0,0,0,1"/>
|
||||
</Button>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Border>
|
||||
</Window>
|
||||
@@ -1,8 +1,8 @@
|
||||
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
Title="Win11Debloat"
|
||||
MinWidth="1024" MinHeight="600"
|
||||
MaxWidth="1280"
|
||||
MinWidth="1130" MinHeight="600"
|
||||
MaxWidth="1400"
|
||||
ResizeMode="CanResize"
|
||||
SnapsToDevicePixels="True"
|
||||
WindowStartupLocation="CenterScreen"
|
||||
@@ -11,43 +11,6 @@
|
||||
Background="Transparent"
|
||||
Foreground="{DynamicResource FgColor}">
|
||||
<Window.Resources>
|
||||
<!-- ScrollBar Style -->
|
||||
<Style TargetType="{x:Type ScrollBar}">
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Setter Property="Width" Value="8"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="{x:Type ScrollBar}">
|
||||
<Grid>
|
||||
<Track Name="PART_Track" IsDirectionReversed="true">
|
||||
<Track.Thumb>
|
||||
<Thumb>
|
||||
<Thumb.Style>
|
||||
<Style TargetType="Thumb">
|
||||
<Setter Property="Background" Value="{DynamicResource ScrollBarThumbColor}"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="Thumb">
|
||||
<Border Background="{TemplateBinding Background}" CornerRadius="4"/>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
<Style.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter Property="Background" Value="{DynamicResource ScrollBarThumbHoverColor}"/>
|
||||
</Trigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</Thumb.Style>
|
||||
</Thumb>
|
||||
</Track.Thumb>
|
||||
</Track>
|
||||
</Grid>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<!-- ComboBox Style -->
|
||||
<Style TargetType="ComboBox">
|
||||
<Setter Property="Background" Value="{DynamicResource ComboBgColor}"/>
|
||||
@@ -420,86 +383,35 @@
|
||||
<!-- CheckBox style for apps panels -->
|
||||
<Style x:Key="AppsPanelCheckBoxStyle" TargetType="CheckBox" BasedOn="{StaticResource {x:Type CheckBox}}">
|
||||
<Setter Property="Margin" Value="2,3,2,3"/>
|
||||
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
|
||||
<Setter Property="VerticalContentAlignment" Value="Center"/>
|
||||
</Style>
|
||||
|
||||
<!-- Button Style -->
|
||||
<Style x:Key="PrimaryButtonStyle" TargetType="Button">
|
||||
<Setter Property="Background" Value="{DynamicResource ButtonBg}"/>
|
||||
<Setter Property="Foreground" Value="white"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource ButtonBg}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="Padding" Value="0"/>
|
||||
<Setter Property="FontSize" Value="14"/>
|
||||
<Setter Property="Cursor" Value="Hand"/>
|
||||
<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"/>
|
||||
</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>
|
||||
<!-- TextBlock style for App ID column in apps table -->
|
||||
<Style x:Key="AppIdTextStyle" TargetType="TextBlock">
|
||||
<Setter Property="Foreground" Value="{DynamicResource AppIdColor}"/>
|
||||
<Setter Property="TextTrimming" Value="CharacterEllipsis"/>
|
||||
<Setter Property="VerticalAlignment" Value="Center"/>
|
||||
</Style>
|
||||
|
||||
<!-- Secondary Button Style -->
|
||||
<Style x:Key="SecondaryButtonStyle" TargetType="Button">
|
||||
<Setter Property="Background" Value="{DynamicResource SecondaryButtonBg}"/>
|
||||
<Setter Property="Foreground" Value="{DynamicResource FgColor}"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource ButtonBorderColor}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="Padding" Value="0"/>
|
||||
<Setter Property="FontSize" Value="14"/>
|
||||
<Setter Property="Cursor" Value="Hand"/>
|
||||
<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 SecondaryButtonDisabled}"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource BorderColor}"/>
|
||||
<Setter Property="Foreground" Value="{DynamicResource SecondaryButtonTextDisabled}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter Property="Background" Value="{DynamicResource SecondaryButtonHover}"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource ButtonBorderColor}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsPressed" Value="True">
|
||||
<Setter Property="Background" Value="{DynamicResource SecondaryButtonPressed}"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource ButtonBorderColor}"/>
|
||||
</Trigger>
|
||||
</Style.Triggers>
|
||||
<!-- TextBlock style for App Name column in apps table -->
|
||||
<Style x:Key="AppNameTextStyle" TargetType="TextBlock">
|
||||
<Setter Property="TextTrimming" Value="CharacterEllipsis"/>
|
||||
<Setter Property="VerticalAlignment" Value="Center"/>
|
||||
</Style>
|
||||
|
||||
<!-- TextBlock style for Description column in apps table -->
|
||||
<Style x:Key="AppDescTextStyle" TargetType="TextBlock">
|
||||
<Setter Property="TextTrimming" Value="CharacterEllipsis"/>
|
||||
<Setter Property="VerticalAlignment" Value="Center"/>
|
||||
<Setter Property="Margin" Value="8,0,8,0"/>
|
||||
</Style>
|
||||
|
||||
<!-- Column widths for the apps table row grid -->
|
||||
<GridLength x:Key="AppTableCol0Width">160</GridLength>
|
||||
<GridLength x:Key="AppTableCol1Width">1*</GridLength>
|
||||
<GridLength x:Key="AppTableCol2Width">286</GridLength>
|
||||
|
||||
<!-- Title Bar Button Style -->
|
||||
<Style x:Key="TitleBarButton" TargetType="Button">
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
@@ -683,7 +595,7 @@
|
||||
</MenuItem>
|
||||
<MenuItem x:Name="MenuLogs" Header="Logs" AutomationProperties.Name="Logs">
|
||||
<MenuItem.Icon>
|
||||
<TextBlock Text="" FontFamily="Segoe Fluent Icons" FontSize="16" Foreground="{DynamicResource FgColor}"/>
|
||||
<TextBlock Text="" FontFamily="Segoe Fluent Icons" FontSize="16" Foreground="{DynamicResource FgColor}"/>
|
||||
</MenuItem.Icon>
|
||||
</MenuItem>
|
||||
<MenuItem x:Name="MenuAbout" Header="About" AutomationProperties.Name="About">
|
||||
@@ -760,12 +672,21 @@
|
||||
<Run Text="Your clean Windows experience is just a few clicks away!"/>
|
||||
</TextBlock>
|
||||
|
||||
<!-- Start Button -->
|
||||
<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">
|
||||
<TextBlock Text="Start" FontWeight="SemiBold" VerticalAlignment="Center" FontSize="24" Margin="0,0,0,3"/>
|
||||
</StackPanel>
|
||||
</Button>
|
||||
<!-- Action Buttons -->
|
||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,20,0,0">
|
||||
<Button x:Name="HomeDefaultModeBtn" Width="180" Height="50" Style="{DynamicResource PrimaryButtonStyle}" Margin="0,0,12,0" AutomationProperties.Name="Default Mode">
|
||||
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
||||
<TextBlock Text="" FontFamily="Segoe Fluent Icons" FontSize="16" VerticalAlignment="Center" Margin="0,0,8,0"/>
|
||||
<TextBlock Text="Default Mode" ToolTip="Quickly select the recommended settings" FontWeight="SemiBold" VerticalAlignment="Center" FontSize="17" Margin="0,0,0,2"/>
|
||||
</StackPanel>
|
||||
</Button>
|
||||
<Button x:Name="HomeStartBtn" Width="180" Height="50" Style="{DynamicResource SecondaryButtonStyle}" AutomationProperties.Name="Custom Setup">
|
||||
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
||||
<TextBlock Text="" FontFamily="Segoe Fluent Icons" FontSize="14" VerticalAlignment="Center" Margin="0,0,8,0"/>
|
||||
<TextBlock Text="Custom Setup" ToolTip="Manually select your preferred settings" FontWeight="SemiBold" VerticalAlignment="Center" FontSize="17" Margin="0,0,0,2"/>
|
||||
</StackPanel>
|
||||
</Button>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</TabItem>
|
||||
@@ -789,9 +710,9 @@
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Grid.Column="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 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 SecondaryButtonStyle}" Height="32" Padding="10,0" Margin="0,0,10,0" AutomationProperties.Name="Clear Selection"/>
|
||||
<Button x:Name="DefaultAppsBtn" Content="Select Default Apps" ToolTip="Select the default selection of apps" Style="{DynamicResource 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="{DynamicResource 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="{DynamicResource SecondaryButtonStyle}" Height="32" Padding="10,0" Margin="0,0,10,0" AutomationProperties.Name="Clear Selection"/>
|
||||
</StackPanel>
|
||||
|
||||
<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"/>
|
||||
@@ -826,16 +747,36 @@
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Apps List -->
|
||||
<Border Grid.Row="0" BorderBrush="{DynamicResource BorderColor}" CornerRadius="4" BorderThickness="1" Margin="20,0,20,10" Background="{DynamicResource CardBgColor}">
|
||||
<Grid>
|
||||
<ScrollViewer VerticalScrollBarVisibility="Auto">
|
||||
<StackPanel x:Name="AppSelectionPanel" Margin="8"/>
|
||||
</ScrollViewer>
|
||||
<Border x:Name="LoadingAppsIndicator" CornerRadius="4" Background="{DynamicResource ScrollBarThumbColor}" Opacity="0.8" Visibility="Collapsed">
|
||||
<TextBlock Text="Loading apps..." FontSize="16" FontWeight="SemiBold" Foreground="{DynamicResource FgColor}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
|
||||
</Border>
|
||||
</Grid>
|
||||
</Border>
|
||||
<Grid Grid.Row="0" Margin="20,0,20,10">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
<!-- Column Headers -->
|
||||
<Border Grid.Row="0" Background="{DynamicResource TableHeaderColor}" BorderBrush="{DynamicResource BorderColor}" BorderThickness="1,1,1,0" CornerRadius="4,4,0,0">
|
||||
<Grid Margin="26,6,8,8">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="160"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="300"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Grid.Column="0" Text="Name" FontWeight="SemiBold" FontSize="16" Foreground="{DynamicResource FgColor}" Margin="16,0,0,0"/>
|
||||
<TextBlock Grid.Column="1" Text="Description" FontWeight="SemiBold" FontSize="16" Foreground="{DynamicResource FgColor}" Margin="24,0,0,0"/>
|
||||
<TextBlock Grid.Column="2" Text="App ID" FontWeight="SemiBold" FontSize="16" Foreground="{DynamicResource FgColor}"/>
|
||||
</Grid>
|
||||
</Border>
|
||||
<!-- Apps content -->
|
||||
<Border Grid.Row="1" BorderBrush="{DynamicResource BorderColor}" CornerRadius="0,0,4,4" BorderThickness="1" Background="{DynamicResource CardBgColor}" Padding="0,1,1,1">
|
||||
<Grid>
|
||||
<ScrollViewer VerticalScrollBarVisibility="Visible">
|
||||
<StackPanel x:Name="AppSelectionPanel" Margin="10,4,0,4"/>
|
||||
</ScrollViewer>
|
||||
<Border x:Name="LoadingAppsIndicator" CornerRadius="0,0,4,4" Background="{DynamicResource CardBgColor}" Opacity="0.8" Visibility="Collapsed">
|
||||
<TextBlock Text="Loading apps..." FontSize="16" FontWeight="SemiBold" Foreground="{DynamicResource FgColor}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
|
||||
</Border>
|
||||
</Grid>
|
||||
</Border>
|
||||
</Grid>
|
||||
|
||||
<!-- Status Info -->
|
||||
<StackPanel Grid.Row="1" Orientation="Horizontal" Margin="20,0,20,0">
|
||||
@@ -851,7 +792,7 @@
|
||||
<Border DockPanel.Dock="Top" Padding="20,10,20,0" Background="{DynamicResource BgColor}">
|
||||
<StackPanel>
|
||||
<TextBlock Text="System Tweaks" FontWeight="Bold" FontSize="20" Margin="0,0,0,5" Foreground="{DynamicResource FgColor}"/>
|
||||
<TextBlock Text="Select which tweaks you want to apply to your system" FontSize="13" Margin="0,0,0,20" Foreground="{DynamicResource FgColor}" TextWrapping="Wrap"/>
|
||||
<TextBlock Text="Select which tweaks you want to apply to your system, hover over settings for more information" FontSize="13" Margin="0,0,0,20" Foreground="{DynamicResource FgColor}" TextWrapping="Wrap"/>
|
||||
|
||||
<!-- Filter Options -->
|
||||
<Grid Margin="0,0,0,12">
|
||||
@@ -862,9 +803,9 @@
|
||||
</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"/>
|
||||
<Button x:Name="LoadDefaultsBtn" Content="Select Default Settings" ToolTip="Select the settings that are recommended for most people" Style="{DynamicResource 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="{DynamicResource 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="{DynamicResource SecondaryButtonStyle}" Padding="10,0" Height="32" Margin="0,0,10,0" AutomationProperties.Name="Clear Selection"/>
|
||||
</StackPanel>
|
||||
|
||||
<Border x:Name="TweakSearchBorder" Grid.Column="2">
|
||||
@@ -932,167 +873,146 @@
|
||||
</DockPanel>
|
||||
</TabItem>
|
||||
|
||||
<!-- Overview Tab -->
|
||||
<TabItem Header="Overview" x:Name="OverviewTab">
|
||||
<!-- Deployment Settings Tab -->
|
||||
<TabItem Header="Deployment Settings" x:Name="DeploymentSettingsTab">
|
||||
<DockPanel>
|
||||
<Border DockPanel.Dock="Top" Padding="20,10,20,0">
|
||||
<StackPanel>
|
||||
<TextBlock Text="Overview" FontWeight="Bold" FontSize="20" Margin="0,0,0,5" Foreground="{DynamicResource FgColor}"/>
|
||||
<TextBlock Text="Review and confirm your choices before proceeding" FontSize="13" Margin="0,0,0,20" Foreground="{DynamicResource FgColor}" TextWrapping="Wrap"/>
|
||||
<TextBlock Text="Deployment Settings" FontWeight="Bold" FontSize="20" Margin="0,0,0,5" Foreground="{DynamicResource FgColor}"/>
|
||||
<TextBlock Text="Configure how your changes will be applied and more" FontSize="13" Margin="0,0,0,20" Foreground="{DynamicResource FgColor}" TextWrapping="Wrap"/>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<Grid>
|
||||
<ScrollViewer VerticalScrollBarVisibility="Auto" Margin="0,-20,0,0" Padding="20,10,20,0">
|
||||
<StackPanel Margin="0,10,0,5">
|
||||
<!-- Selected Changes -->
|
||||
<Border BorderBrush="{DynamicResource BorderColor}" BorderThickness="1" CornerRadius="4" Background="{DynamicResource CardBgColor}" Padding="16,12,16,4" Margin="0,0,0,16">
|
||||
<StackPanel>
|
||||
<TextBlock Text="Selected Changes" Style="{StaticResource CategoryHeaderTextBlock}"/>
|
||||
<StackPanel x:Name="OverviewChangesPanel"/>
|
||||
<StackPanel Margin="0,0,0,3"/>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- 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="Other User"/>
|
||||
<ComboBoxItem Content="Windows Default User (Sysprep)"/>
|
||||
</ComboBox>
|
||||
<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"/>
|
||||
<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.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Grid.Column="0" Text="" 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"/>
|
||||
<TextBox x:Name="OtherUsernameTextBox" Grid.Column="1" Style="{StaticResource UserTextBoxStyle}" Text="" AutomationProperties.Name="Enter username"/>
|
||||
</Grid>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
<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>
|
||||
</Border>
|
||||
<Grid Grid.Row="0">
|
||||
<ScrollViewer VerticalScrollBarVisibility="Auto" Margin="0,-20,0,0" Padding="20,10,20,0">
|
||||
<Grid Margin="0,10,0,5">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- App Removal Scope -->
|
||||
<Border x:Name="AppRemovalScopeSection" BorderBrush="{DynamicResource BorderColor}" BorderThickness="1" CornerRadius="4" Background="{DynamicResource CardBgColor}" Padding="16,12" Margin="0,0,0,16">
|
||||
<StackPanel>
|
||||
<TextBlock Text="Remove Apps From" Style="{StaticResource CategoryHeaderTextBlock}"/>
|
||||
<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>
|
||||
</Border>
|
||||
|
||||
<!-- Options -->
|
||||
<Border BorderBrush="{DynamicResource BorderColor}" BorderThickness="1" CornerRadius="4" Background="{DynamicResource CardBgColor}" Padding="16,12,16,3" Margin="0,0,0,16">
|
||||
<StackPanel>
|
||||
<TextBlock Text="Options" Style="{StaticResource CategoryHeaderTextBlock}"/>
|
||||
|
||||
<!-- Restore Point Option -->
|
||||
<!-- Apply Changes To -->
|
||||
<Border Grid.Row="0" BorderBrush="{DynamicResource BorderColor}" BorderThickness="1" CornerRadius="4" Background="{DynamicResource CardBgColor}" Padding="16,12" Margin="0,0,0,16">
|
||||
<StackPanel>
|
||||
<CheckBox x:Name="RestorePointCheckBox" Style="{StaticResource FeatureCheckboxStyle}" Content="Create a system restore point (Recommended)" AutomationProperties.Name="Create a system restore point (Recommended)"/>
|
||||
<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="Other User"/>
|
||||
<ComboBoxItem Content="Windows Default User (Sysprep)"/>
|
||||
</ComboBox>
|
||||
<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"/>
|
||||
<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.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Grid.Column="0" Text="" 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"/>
|
||||
<TextBox x:Name="OtherUsernameTextBox" Grid.Column="1" Style="{StaticResource UserTextBoxStyle}" Text="" AutomationProperties.Name="Enter username"/>
|
||||
</Grid>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
<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>
|
||||
|
||||
<!-- Restart Explorer Option -->
|
||||
</Border>
|
||||
|
||||
<!-- App Removal Scope -->
|
||||
<Border Grid.Row="1" x:Name="AppRemovalScopeSection" BorderBrush="{DynamicResource BorderColor}" BorderThickness="1" CornerRadius="4" Background="{DynamicResource CardBgColor}" Padding="16,12" Margin="0,0,0,16">
|
||||
<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"/>
|
||||
<TextBlock Text="Remove Apps For" Style="{StaticResource CategoryHeaderTextBlock}"/>
|
||||
<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>
|
||||
|
||||
<!-- Apply Changes Button -->
|
||||
<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">
|
||||
<TextBlock Text="" FontFamily="Segoe Fluent Icons" FontSize="20" FontWeight="SemiBold" VerticalAlignment="Center"/>
|
||||
<TextBlock Text="Apply Changes" VerticalAlignment="Center" FontSize="18" FontWeight="SemiBold" Margin="8,0,0,4"/>
|
||||
</StackPanel>
|
||||
</Button>
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
<!-- Top fade gradient -->
|
||||
<Border IsHitTestVisible="False" VerticalAlignment="Top" Height="15" Margin="0,-15,20,0" Background="{DynamicResource BgColor}">
|
||||
<Border.OpacityMask>
|
||||
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
|
||||
<GradientStop Color="Black" Offset="0"/>
|
||||
<GradientStop Color="Black" Offset="0.5"/>
|
||||
<GradientStop Color="Transparent" Offset="1"/>
|
||||
</LinearGradientBrush>
|
||||
</Border.OpacityMask>
|
||||
</Border>
|
||||
<!-- Bottom fade gradient -->
|
||||
<Border IsHitTestVisible="False" VerticalAlignment="Bottom" Height="20" Margin="0,0,20,0" Background="{DynamicResource BgColor}">
|
||||
<Border.OpacityMask>
|
||||
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
|
||||
<GradientStop Color="Transparent" Offset="0"/>
|
||||
<GradientStop Color="Black" Offset="1"/>
|
||||
</LinearGradientBrush>
|
||||
</Border.OpacityMask>
|
||||
</Border>
|
||||
</Border>
|
||||
|
||||
<!-- Options -->
|
||||
<Border Grid.Row="2" BorderBrush="{DynamicResource BorderColor}" BorderThickness="1" CornerRadius="4" Background="{DynamicResource CardBgColor}" Padding="16,12,16,3" Margin="0,0,0,16">
|
||||
<StackPanel>
|
||||
<TextBlock Text="Options" Style="{StaticResource CategoryHeaderTextBlock}"/>
|
||||
|
||||
<!-- Restore Point Option -->
|
||||
<StackPanel>
|
||||
<CheckBox x:Name="RestorePointCheckBox" Style="{StaticResource FeatureCheckboxStyle}" IsChecked="True" 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>
|
||||
</Border>
|
||||
</Grid>
|
||||
</ScrollViewer>
|
||||
<!-- Top fade gradient -->
|
||||
<Border IsHitTestVisible="False" VerticalAlignment="Top" Height="10" Margin="0,-12,20,0" Background="{DynamicResource BgColor}">
|
||||
<Border.OpacityMask>
|
||||
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
|
||||
<GradientStop Color="Black" Offset="0"/>
|
||||
<GradientStop Color="Black" Offset="0.5"/>
|
||||
<GradientStop Color="Transparent" Offset="1"/>
|
||||
</LinearGradientBrush>
|
||||
</Border.OpacityMask>
|
||||
</Border>
|
||||
<!-- Bottom fade gradient -->
|
||||
<Border IsHitTestVisible="False" VerticalAlignment="Bottom" Height="20" Margin="0,0,20,0" Background="{DynamicResource BgColor}">
|
||||
<Border.OpacityMask>
|
||||
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
|
||||
<GradientStop Color="Transparent" Offset="0"/>
|
||||
<GradientStop Color="Black" Offset="1"/>
|
||||
</LinearGradientBrush>
|
||||
</Border.OpacityMask>
|
||||
</Border>
|
||||
</Grid>
|
||||
|
||||
<!-- Review & Apply Section -->
|
||||
<StackPanel Grid.Row="1" HorizontalAlignment="Stretch" Background="{DynamicResource BgColor}">
|
||||
<Button x:Name="ReviewChangesBtn" Background="Transparent" BorderThickness="0" Cursor="Hand" HorizontalAlignment="Center" Margin="0,4,0,8" AutomationProperties.Name="Review selected changes">
|
||||
<Button.Template>
|
||||
<ControlTemplate TargetType="Button">
|
||||
<TextBlock x:Name="LinkText" Text="Review selected changes" FontSize="14" Foreground="{DynamicResource ButtonBg}" FontWeight="SemiBold" HorizontalAlignment="Center"/>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter TargetName="LinkText" Property="Foreground" Value="{DynamicResource ButtonHover}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsPressed" Value="True">
|
||||
<Setter TargetName="LinkText" Property="Foreground" Value="{DynamicResource ButtonPressed}"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Button.Template>
|
||||
</Button>
|
||||
<Button x:Name="DeploymentApplyBtn" Style="{DynamicResource PrimaryButtonStyle}" Width="190" Height="44" HorizontalAlignment="Center" AutomationProperties.Name="Apply Changes">
|
||||
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
||||
<TextBlock Text="" FontFamily="Segoe Fluent Icons" FontSize="20" FontWeight="SemiBold" VerticalAlignment="Center"/>
|
||||
<TextBlock Text="Apply Changes" VerticalAlignment="Center" FontSize="18" FontWeight="SemiBold" Margin="8,0,0,4"/>
|
||||
</StackPanel>
|
||||
</Button>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</DockPanel>
|
||||
</TabItem>
|
||||
|
||||
<!-- Apply Tab -->
|
||||
<TabItem Header="Apply" x:Name="ApplyTab">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Header -->
|
||||
<Border DockPanel.Dock="Top" Padding="20,10,20,0">
|
||||
<StackPanel Grid.Row="0">
|
||||
<TextBlock Text="Applying Changes" FontWeight="Bold" FontSize="20" Margin="0,0,0,5" Foreground="{DynamicResource FgColor}"/>
|
||||
<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 -->
|
||||
<Border Grid.Row="1" BorderBrush="{DynamicResource BorderColor}" BorderThickness="1" CornerRadius="4" Background="#0C0C0C" Margin="20,0">
|
||||
<ScrollViewer x:Name="ConsoleScrollViewer" VerticalScrollBarVisibility="Auto" Padding="10">
|
||||
<TextBlock x:Name="ConsoleOutput" FontFamily="Consolas" FontSize="12" Foreground="#CCCCCC" TextWrapping="Wrap" Text="" AutomationProperties.LiveSetting="Polite"/>
|
||||
</ScrollViewer>
|
||||
</Border>
|
||||
|
||||
<!-- Progress and Finish Button -->
|
||||
<Border Grid.Row="2" Background="{DynamicResource BgColor}" Padding="10,0" CornerRadius="0,0,8,8" Margin="20,16,20,16">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Status and Finish Button -->
|
||||
<StackPanel Grid.Row="1" HorizontalAlignment="Center">
|
||||
<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"/>
|
||||
</Button>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Border>
|
||||
</Grid>
|
||||
</TabItem>
|
||||
</TabControl>
|
||||
|
||||
<!-- Bottom Navigation Buttons -->
|
||||
@@ -1103,15 +1023,15 @@
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Button x:Name="PreviousBtn" Grid.Column="0" Width="120" Height="36" Style="{StaticResource SecondaryButtonStyle}" Visibility="Collapsed" Margin="10,0,0,0" AutomationProperties.Name="Previous">
|
||||
<Button x:Name="PreviousBtn" Grid.Column="0" Width="120" Height="36" Style="{DynamicResource SecondaryButtonStyle}" Visibility="Collapsed" Margin="10,0,0,0" AutomationProperties.Name="Back">
|
||||
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
||||
<TextBlock Text="" 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="Back" VerticalAlignment="Center" FontSize="14" Margin="0,0,0,1"/>
|
||||
</StackPanel>
|
||||
</Button>
|
||||
|
||||
<StackPanel Grid.Column="2" Orientation="Horizontal" HorizontalAlignment="Right">
|
||||
<Button x:Name="NextBtn" Width="120" Height="36" Margin="0,0,10,0" Style="{StaticResource PrimaryButtonStyle}" AutomationProperties.Name="Next">
|
||||
<Button x:Name="NextBtn" Width="120" Height="36" Margin="0,0,10,0" Style="{DynamicResource PrimaryButtonStyle}" AutomationProperties.Name="Next">
|
||||
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
||||
<TextBlock Text="Next" VerticalAlignment="Center" FontSize="14" Margin="0,0,0,1"/>
|
||||
<TextBlock Text="" FontFamily="Segoe Fluent Icons" FontSize="12" Margin="8,0,0,0" VerticalAlignment="Center"/>
|
||||
@@ -1124,7 +1044,7 @@
|
||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
|
||||
<Ellipse x:Name="ProgressIndicator1" Width="10" Height="10" Margin="4,0" Fill="#808080" ToolTip="App Removal"/>
|
||||
<Ellipse x:Name="ProgressIndicator2" Width="10" Height="10" Margin="4,0" Fill="#808080" ToolTip="System Tweaks"/>
|
||||
<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="Deployment Settings"/>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
|
||||
|
||||
@@ -3,87 +3,14 @@
|
||||
Title="MessageBox"
|
||||
Width="440"
|
||||
SizeToContent="Height"
|
||||
MaxHeight="500"
|
||||
ResizeMode="NoResize"
|
||||
WindowStartupLocation="CenterScreen"
|
||||
WindowStartupLocation="CenterOwner"
|
||||
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"
|
||||
@@ -117,32 +44,34 @@
|
||||
</Grid>
|
||||
|
||||
<!-- Message Content -->
|
||||
<Grid Grid.Row="1" Margin="24,12,24,20">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto" MaxHeight="500" Padding="0" Margin="20,12,1,20">
|
||||
<Grid Margin="0,0,20,0">
|
||||
<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"/>
|
||||
<!-- Icon -->
|
||||
<TextBlock x:Name="IconText"
|
||||
Grid.Column="0"
|
||||
FontFamily="Segoe Fluent Icons"
|
||||
FontSize="24"
|
||||
Foreground="{DynamicResource FgColor}"
|
||||
VerticalAlignment="Center"
|
||||
Margin="4,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>
|
||||
<!-- 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>
|
||||
</ScrollViewer>
|
||||
|
||||
<!-- Button Panel -->
|
||||
<Border Grid.Row="2"
|
||||
@@ -156,10 +85,12 @@
|
||||
HorizontalAlignment="Right">
|
||||
<Button x:Name="Button1"
|
||||
Content="OK"
|
||||
Style="{StaticResource PrimaryMessageBoxButton}"/>
|
||||
Height="32" MinWidth="80" Margin="4,0"
|
||||
Style="{DynamicResource PrimaryButtonStyle}"/>
|
||||
<Button x:Name="Button2"
|
||||
Content="Cancel"
|
||||
Style="{StaticResource MessageBoxButton}"
|
||||
Height="32" MinWidth="80" Margin="4,0"
|
||||
Style="{DynamicResource SecondaryButtonStyle}"
|
||||
Visibility="Collapsed"/>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
165
Schemas/SharedStyles.xaml
Normal file
165
Schemas/SharedStyles.xaml
Normal file
@@ -0,0 +1,165 @@
|
||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||
|
||||
<!-- Primary Button Style -->
|
||||
<Style x:Key="PrimaryButtonStyle" TargetType="Button">
|
||||
<Setter Property="Background" Value="{DynamicResource ButtonBg}"/>
|
||||
<Setter Property="Foreground" Value="white"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource ButtonBg}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="Padding" Value="0"/>
|
||||
<Setter Property="FontSize" Value="14"/>
|
||||
<Setter Property="Cursor" Value="Hand"/>
|
||||
<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"/>
|
||||
</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>
|
||||
|
||||
<!-- Secondary Button Style -->
|
||||
<Style x:Key="SecondaryButtonStyle" TargetType="Button">
|
||||
<Setter Property="Background" Value="{DynamicResource SecondaryButtonBg}"/>
|
||||
<Setter Property="Foreground" Value="{DynamicResource FgColor}"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource ButtonBorderColor}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="Padding" Value="0"/>
|
||||
<Setter Property="FontSize" Value="14"/>
|
||||
<Setter Property="Cursor" Value="Hand"/>
|
||||
<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 SecondaryButtonDisabled}"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource BorderColor}"/>
|
||||
<Setter Property="Foreground" Value="{DynamicResource SecondaryButtonTextDisabled}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter Property="Background" Value="{DynamicResource SecondaryButtonHover}"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource ButtonBorderColor}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsPressed" Value="True">
|
||||
<Setter Property="Background" Value="{DynamicResource SecondaryButtonPressed}"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource ButtonBorderColor}"/>
|
||||
</Trigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
|
||||
<!-- Hyperlink Style -->
|
||||
<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>
|
||||
|
||||
<!-- ProgressBar Style -->
|
||||
<Style x:Key="ApplyProgressBarStyle" TargetType="ProgressBar">
|
||||
<Setter Property="Background" Value="{DynamicResource ButtonBorderColor}"/>
|
||||
<Setter Property="Foreground" Value="{DynamicResource ButtonBg}"/>
|
||||
<Setter Property="Height" Value="6"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="ProgressBar">
|
||||
<Grid>
|
||||
<Border x:Name="PART_Track" Background="{TemplateBinding Background}" CornerRadius="3" Height="{TemplateBinding Height}"/>
|
||||
<Border x:Name="PART_Indicator" Background="{TemplateBinding Foreground}" CornerRadius="3" HorizontalAlignment="Left" Height="{TemplateBinding Height}"/>
|
||||
</Grid>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<!-- Modal Title Style -->
|
||||
<Style x:Key="ModalTitleStyle" TargetType="TextBlock">
|
||||
<Setter Property="FontWeight" Value="Bold"/>
|
||||
<Setter Property="FontSize" Value="20"/>
|
||||
<Setter Property="Foreground" Value="{DynamicResource FgColor}"/>
|
||||
<Setter Property="HorizontalAlignment" Value="Center"/>
|
||||
<Setter Property="Margin" Value="0,0,0,8"/>
|
||||
</Style>
|
||||
|
||||
<!-- Modal Subtext Style -->
|
||||
<Style x:Key="ModalSubtextStyle" TargetType="TextBlock">
|
||||
<Setter Property="FontSize" Value="13"/>
|
||||
<Setter Property="Foreground" Value="{DynamicResource FgColor}"/>
|
||||
<Setter Property="Opacity" Value="0.8"/>
|
||||
<Setter Property="HorizontalAlignment" Value="Center"/>
|
||||
<Setter Property="TextAlignment" Value="Center"/>
|
||||
</Style>
|
||||
|
||||
<!-- ScrollBar Style -->
|
||||
<Style TargetType="{x:Type ScrollBar}">
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Setter Property="Width" Value="8"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="{x:Type ScrollBar}">
|
||||
<Grid>
|
||||
<Track Name="PART_Track" IsDirectionReversed="true">
|
||||
<Track.Thumb>
|
||||
<Thumb>
|
||||
<Thumb.Style>
|
||||
<Style TargetType="Thumb">
|
||||
<Setter Property="Background" Value="{DynamicResource ScrollBarThumbColor}"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="Thumb">
|
||||
<Border Background="{TemplateBinding Background}" CornerRadius="4"/>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
<Style.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter Property="Background" Value="{DynamicResource ScrollBarThumbHoverColor}"/>
|
||||
</Trigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</Thumb.Style>
|
||||
</Thumb>
|
||||
</Track.Thumb>
|
||||
</Track>
|
||||
</Grid>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
</ResourceDictionary>
|
||||
57
Scripts/AppRemoval/ForceRemoveEdge.ps1
Normal file
57
Scripts/AppRemoval/ForceRemoveEdge.ps1
Normal file
@@ -0,0 +1,57 @@
|
||||
# Forcefully removes Microsoft Edge using its uninstaller
|
||||
# Credit: Based on work from loadstring1 & ave9858
|
||||
function ForceRemoveEdge {
|
||||
Write-Host "> Forcefully uninstalling Microsoft Edge..."
|
||||
|
||||
$regView = [Microsoft.Win32.RegistryView]::Registry32
|
||||
$hklm = [Microsoft.Win32.RegistryKey]::OpenBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, $regView)
|
||||
$hklm.CreateSubKey('SOFTWARE\Microsoft\EdgeUpdateDev').SetValue('AllowUninstall', '')
|
||||
|
||||
# Create stub (This somehow allows uninstalling Edge)
|
||||
$edgeStub = "$env:SystemRoot\SystemApps\Microsoft.MicrosoftEdge_8wekyb3d8bbwe"
|
||||
New-Item $edgeStub -ItemType Directory | Out-Null
|
||||
New-Item "$edgeStub\MicrosoftEdge.exe" | Out-Null
|
||||
|
||||
# Remove edge
|
||||
$uninstallRegKey = $hklm.OpenSubKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft Edge')
|
||||
if ($null -ne $uninstallRegKey) {
|
||||
Write-Host "Running uninstaller..."
|
||||
$uninstallString = $uninstallRegKey.GetValue('UninstallString') + ' --force-uninstall'
|
||||
Invoke-NonBlocking -ScriptBlock {
|
||||
param($cmd)
|
||||
Start-Process cmd.exe "/c $cmd" -WindowStyle Hidden -Wait
|
||||
} -ArgumentList $uninstallString
|
||||
|
||||
Write-Host "Removing leftover files..."
|
||||
|
||||
$edgePaths = @(
|
||||
"$env:ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Edge.lnk",
|
||||
"$env:APPDATA\Microsoft\Internet Explorer\Quick Launch\Microsoft Edge.lnk",
|
||||
"$env:APPDATA\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\Microsoft Edge.lnk",
|
||||
"$env:APPDATA\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\Tombstones\Microsoft Edge.lnk",
|
||||
"$env:PUBLIC\Desktop\Microsoft Edge.lnk",
|
||||
"$env:USERPROFILE\Desktop\Microsoft Edge.lnk",
|
||||
"$edgeStub"
|
||||
)
|
||||
|
||||
foreach ($path in $edgePaths) {
|
||||
if (Test-Path -Path $path) {
|
||||
Remove-Item -Path $path -Force -Recurse -ErrorAction SilentlyContinue
|
||||
Write-Host " Removed $path" -ForegroundColor DarkGray
|
||||
}
|
||||
}
|
||||
|
||||
Write-Host "Cleaning up registry..."
|
||||
|
||||
# Remove MS Edge from autostart
|
||||
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run" /v "MicrosoftEdgeAutoLaunch_A9F6DCE4ABADF4F51CF45CD7129E3C6C" /f *>$null
|
||||
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run" /v "Microsoft Edge Update" /f *>$null
|
||||
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\StartupApproved\Run" /v "MicrosoftEdgeAutoLaunch_A9F6DCE4ABADF4F51CF45CD7129E3C6C" /f *>$null
|
||||
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\StartupApproved\Run" /v "Microsoft Edge Update" /f *>$null
|
||||
|
||||
Write-Host "Microsoft Edge was uninstalled"
|
||||
}
|
||||
else {
|
||||
Write-Host "Unable to forcefully uninstall Microsoft Edge, uninstaller could not be found" -ForegroundColor Red
|
||||
}
|
||||
}
|
||||
111
Scripts/AppRemoval/RemoveApps.ps1
Normal file
111
Scripts/AppRemoval/RemoveApps.ps1
Normal file
@@ -0,0 +1,111 @@
|
||||
# Removes apps specified during function call based on the target scope.
|
||||
function RemoveApps {
|
||||
param (
|
||||
$appslist
|
||||
)
|
||||
|
||||
# Determine target from script-level params, defaulting to AllUsers
|
||||
$targetUser = GetTargetUserForAppRemoval
|
||||
|
||||
$appIndex = 0
|
||||
$appCount = @($appsList).Count
|
||||
|
||||
Foreach ($app in $appsList) {
|
||||
if ($script:CancelRequested) {
|
||||
return
|
||||
}
|
||||
|
||||
$appIndex++
|
||||
|
||||
# Update step name and sub-progress to show which app is being removed (only for bulk removal)
|
||||
if ($script:ApplySubStepCallback -and $appCount -gt 1) {
|
||||
& $script:ApplySubStepCallback "Removing apps ($appIndex/$appCount)" $appIndex $appCount
|
||||
}
|
||||
|
||||
Write-Host "Attempting to remove $app..."
|
||||
|
||||
# Use WinGet only to remove OneDrive and Edge
|
||||
if (($app -eq "Microsoft.OneDrive") -or ($app -eq "Microsoft.Edge")) {
|
||||
if ($script:WingetInstalled -eq $false) {
|
||||
Write-Host "WinGet is either not installed or is outdated, $app could not be removed" -ForegroundColor Red
|
||||
continue
|
||||
}
|
||||
|
||||
$appName = $app -replace '\.', '_'
|
||||
|
||||
# Uninstall app via WinGet, or create a scheduled task to uninstall it later
|
||||
if ($script:Params.ContainsKey("User")) {
|
||||
ImportRegistryFile "Adding scheduled task to uninstall $app for user $(GetUserName)..." "Uninstall_$($appName).reg"
|
||||
}
|
||||
elseif ($script:Params.ContainsKey("Sysprep")) {
|
||||
ImportRegistryFile "Adding scheduled task to uninstall $app after for new users..." "Uninstall_$($appName).reg"
|
||||
}
|
||||
else {
|
||||
# Uninstall app via WinGet
|
||||
$wingetOutput = Invoke-NonBlocking -ScriptBlock {
|
||||
param($appId)
|
||||
winget uninstall --accept-source-agreements --disable-interactivity --id $appId
|
||||
} -ArgumentList $app
|
||||
|
||||
If (($app -eq "Microsoft.Edge") -and (Select-String -InputObject $wingetOutput -Pattern "Uninstall failed with exit code")) {
|
||||
Write-Host "Unable to uninstall Microsoft Edge via WinGet" -ForegroundColor Red
|
||||
|
||||
if ($script:GuiWindow) {
|
||||
$result = Show-MessageBox -Message 'Unable to uninstall Microsoft Edge via WinGet. Would you like to forcefully uninstall it? NOT RECOMMENDED!' -Title 'Force Uninstall Microsoft Edge?' -Button 'YesNo' -Icon 'Warning'
|
||||
|
||||
if ($result -eq 'Yes') {
|
||||
Write-Host ""
|
||||
ForceRemoveEdge
|
||||
}
|
||||
}
|
||||
elseif ($( Read-Host -Prompt "Would you like to forcefully uninstall Microsoft Edge? NOT RECOMMENDED! (y/n)" ) -eq 'y') {
|
||||
Write-Host ""
|
||||
ForceRemoveEdge
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
continue
|
||||
}
|
||||
|
||||
# Use Remove-AppxPackage to remove all other apps
|
||||
$appPattern = '*' + $app + '*'
|
||||
|
||||
try {
|
||||
switch ($targetUser) {
|
||||
"AllUsers" {
|
||||
# Remove installed app for all existing users, and from OS image
|
||||
Invoke-NonBlocking -ScriptBlock {
|
||||
param($pattern)
|
||||
Get-AppxPackage -Name $pattern -AllUsers | Remove-AppxPackage -AllUsers -ErrorAction Continue
|
||||
Get-AppxProvisionedPackage -Online | Where-Object { $_.PackageName -like $pattern } | ForEach-Object { Remove-ProvisionedAppxPackage -Online -AllUsers -PackageName $_.PackageName }
|
||||
} -ArgumentList $appPattern
|
||||
}
|
||||
"CurrentUser" {
|
||||
# Remove installed app for current user only
|
||||
Invoke-NonBlocking -ScriptBlock {
|
||||
param($pattern)
|
||||
Get-AppxPackage -Name $pattern | Remove-AppxPackage -ErrorAction Continue
|
||||
} -ArgumentList $appPattern
|
||||
}
|
||||
default {
|
||||
# Target is a specific username - remove app for that user only
|
||||
Invoke-NonBlocking -ScriptBlock {
|
||||
param($pattern, $user)
|
||||
$userAccount = New-Object System.Security.Principal.NTAccount($user)
|
||||
$userSid = $userAccount.Translate([System.Security.Principal.SecurityIdentifier]).Value
|
||||
Get-AppxPackage -Name $pattern -User $userSid | Remove-AppxPackage -User $userSid -ErrorAction Continue
|
||||
} -ArgumentList @($appPattern, $targetUser)
|
||||
}
|
||||
}
|
||||
}
|
||||
catch {
|
||||
if ($DebugPreference -ne "SilentlyContinue") {
|
||||
Write-Host "Something went wrong while trying to remove $app" -ForegroundColor Yellow
|
||||
Write-Host $psitem.Exception.StackTrace -ForegroundColor Gray
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Write-Host ""
|
||||
}
|
||||
11
Scripts/CLI/AwaitKeyToExit.ps1
Normal file
11
Scripts/CLI/AwaitKeyToExit.ps1
Normal file
@@ -0,0 +1,11 @@
|
||||
function AwaitKeyToExit {
|
||||
# Suppress prompt if Silent parameter was passed
|
||||
if (-not $Silent) {
|
||||
Write-Output ""
|
||||
Write-Output "Press any key to exit..."
|
||||
$null = [System.Console]::ReadKey()
|
||||
}
|
||||
|
||||
Stop-Transcript
|
||||
Exit
|
||||
}
|
||||
104
Scripts/Features/CreateSystemRestorePoint.ps1
Normal file
104
Scripts/Features/CreateSystemRestorePoint.ps1
Normal file
@@ -0,0 +1,104 @@
|
||||
function CreateSystemRestorePoint {
|
||||
$SysRestore = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore" -Name "RPSessionInterval"
|
||||
$failed = $false
|
||||
|
||||
if ($SysRestore.RPSessionInterval -eq 0) {
|
||||
# In GUI mode, skip the prompt and just try to enable it
|
||||
if ($script:GuiWindow -or $Silent -or $( Read-Host -Prompt "System restore is disabled, would you like to enable it and create a restore point? (y/n)") -eq 'y') {
|
||||
$enableSystemRestoreJob = Start-Job {
|
||||
try {
|
||||
Enable-ComputerRestore -Drive "$env:SystemDrive"
|
||||
}
|
||||
catch {
|
||||
return "Error: Failed to enable System Restore: $_"
|
||||
}
|
||||
return $null
|
||||
}
|
||||
|
||||
$enableSystemRestoreJobDone = $enableSystemRestoreJob | Wait-Job -TimeOut 20
|
||||
|
||||
if (-not $enableSystemRestoreJobDone) {
|
||||
Remove-Job -Job $enableSystemRestoreJob -Force -ErrorAction SilentlyContinue
|
||||
Write-Host "Error: Failed to enable system restore and create restore point, operation timed out" -ForegroundColor Red
|
||||
$failed = $true
|
||||
}
|
||||
else {
|
||||
$result = Receive-Job $enableSystemRestoreJob
|
||||
Remove-Job -Job $enableSystemRestoreJob -ErrorAction SilentlyContinue
|
||||
if ($result) {
|
||||
Write-Host $result -ForegroundColor Red
|
||||
$failed = $true
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
Write-Host ""
|
||||
$failed = $true
|
||||
}
|
||||
}
|
||||
|
||||
if (-not $failed) {
|
||||
$createRestorePointJob = Start-Job {
|
||||
# Find existing restore points that are less than 24 hours old
|
||||
try {
|
||||
$recentRestorePoints = Get-ComputerRestorePoint | Where-Object { (Get-Date) - [System.Management.ManagementDateTimeConverter]::ToDateTime($_.CreationTime) -le (New-TimeSpan -Hours 24) }
|
||||
}
|
||||
catch {
|
||||
return @{ Success = $false; Message = "Error: Unable to retrieve existing restore points: $_" }
|
||||
}
|
||||
|
||||
if ($recentRestorePoints.Count -eq 0) {
|
||||
try {
|
||||
Checkpoint-Computer -Description "Restore point created by Win11Debloat" -RestorePointType "MODIFY_SETTINGS"
|
||||
return @{ Success = $true; Message = "System restore point created successfully" }
|
||||
}
|
||||
catch {
|
||||
return @{ Success = $false; Message = "Error: Unable to create restore point: $_" }
|
||||
}
|
||||
}
|
||||
else {
|
||||
return @{ Success = $true; Message = "A recent restore point already exists, no new restore point was created" }
|
||||
}
|
||||
}
|
||||
|
||||
$createRestorePointJobDone = $createRestorePointJob | Wait-Job -TimeOut 20
|
||||
|
||||
if (-not $createRestorePointJobDone) {
|
||||
Remove-Job -Job $createRestorePointJob -Force -ErrorAction SilentlyContinue
|
||||
Write-Host "Error: Failed to create system restore point, operation timed out" -ForegroundColor Red
|
||||
$failed = $true
|
||||
}
|
||||
else {
|
||||
$result = Receive-Job $createRestorePointJob
|
||||
Remove-Job -Job $createRestorePointJob -ErrorAction SilentlyContinue
|
||||
if ($result.Success) {
|
||||
Write-Host $result.Message
|
||||
}
|
||||
else {
|
||||
Write-Host $result.Message -ForegroundColor Red
|
||||
$failed = $true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Ensure that the user is aware if creating a restore point failed, and give them the option to continue without a restore point or cancel the script
|
||||
if ($failed) {
|
||||
if ($script:GuiWindow) {
|
||||
$result = Show-MessageBox "Failed to create a system restore point. Do you want to continue without a restore point?" "Restore Point Creation Failed" "YesNo" "Warning"
|
||||
|
||||
if ($result -ne "Yes") {
|
||||
$script:CancelRequested = $true
|
||||
return
|
||||
}
|
||||
}
|
||||
elseif (-not $Silent) {
|
||||
Write-Host "Failed to create a system restore point. Do you want to continue without a restore point? (y/n)" -ForegroundColor Yellow
|
||||
if ($( Read-Host ) -ne 'y') {
|
||||
$script:CancelRequested = $true
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
Write-Host "Warning: Continuing without restore point" -ForegroundColor Yellow
|
||||
}
|
||||
}
|
||||
52
Scripts/Features/DisableStoreSearchSuggestions.ps1
Normal file
52
Scripts/Features/DisableStoreSearchSuggestions.ps1
Normal file
@@ -0,0 +1,52 @@
|
||||
# Disables Microsoft Store search suggestions in the start menu for all users by denying access to the Store app database file for each user
|
||||
function DisableStoreSearchSuggestionsForAllUsers {
|
||||
# Get path to Store app database for all users
|
||||
$userPathString = GetUserDirectory -userName "*" -fileName "AppData\Local\Packages"
|
||||
$usersStoreDbPaths = get-childitem -path $userPathString
|
||||
|
||||
# Go through all users and disable start search suggestions
|
||||
ForEach ($storeDbPath in $usersStoreDbPaths) {
|
||||
DisableStoreSearchSuggestions ($storeDbPath.FullName + "\Microsoft.WindowsStore_8wekyb3d8bbwe\LocalState\store.db")
|
||||
}
|
||||
|
||||
# Also disable start search suggestions for the default user profile
|
||||
$defaultStoreDbPath = GetUserDirectory -userName "Default" -fileName "AppData\Local\Packages\Microsoft.WindowsStore_8wekyb3d8bbwe\LocalState\store.db" -exitIfPathNotFound $false
|
||||
DisableStoreSearchSuggestions $defaultStoreDbPath
|
||||
}
|
||||
|
||||
|
||||
# Disables Microsoft Store search suggestions in the start menu by denying access to the Store app database file
|
||||
function DisableStoreSearchSuggestions {
|
||||
param (
|
||||
$StoreAppsDatabase = "$env:LocalAppData\Packages\Microsoft.WindowsStore_8wekyb3d8bbwe\LocalState\store.db"
|
||||
)
|
||||
|
||||
# Change path to correct user if a user was specified
|
||||
if ($script:Params.ContainsKey("User")) {
|
||||
$StoreAppsDatabase = GetUserDirectory -userName "$(GetUserName)" -fileName "AppData\Local\Packages\Microsoft.WindowsStore_8wekyb3d8bbwe\LocalState\store.db" -exitIfPathNotFound $false
|
||||
}
|
||||
|
||||
$userName = [regex]::Match($StoreAppsDatabase, '(?:Users\\)([^\\]+)(?:\\AppData)').Groups[1].Value
|
||||
|
||||
# This file doesn't exist in EEA (No Store app suggestions).
|
||||
if (-not (Test-Path -Path $StoreAppsDatabase))
|
||||
{
|
||||
Write-Host "Unable to find Store app database for user $userName, creating it now to prevent Windows from creating it later..." -ForegroundColor Yellow
|
||||
|
||||
$storeDbDir = Split-Path -Path $StoreAppsDatabase -Parent
|
||||
|
||||
if (-not (Test-Path -Path $storeDbDir)) {
|
||||
New-Item -Path $storeDbDir -ItemType Directory -Force | Out-Null
|
||||
}
|
||||
|
||||
New-Item -Path $StoreAppsDatabase -ItemType File -Force | Out-Null
|
||||
}
|
||||
|
||||
$AccountSid = [System.Security.Principal.SecurityIdentifier]::new('S-1-1-0') # 'EVERYONE' group
|
||||
$Acl = Get-Acl -Path $StoreAppsDatabase
|
||||
$Ace = [System.Security.AccessControl.FileSystemAccessRule]::new($AccountSid, 'FullControl', 'Deny')
|
||||
$Acl.SetAccessRule($Ace) | Out-Null
|
||||
Set-Acl -Path $StoreAppsDatabase -AclObject $Acl | Out-Null
|
||||
|
||||
Write-Host "Disabled Microsoft Store search suggestions for user $userName"
|
||||
}
|
||||
16
Scripts/Features/EnableWindowsFeature.ps1
Normal file
16
Scripts/Features/EnableWindowsFeature.ps1
Normal file
@@ -0,0 +1,16 @@
|
||||
# Enables a Windows optional feature and pipes its output to the console
|
||||
function EnableWindowsFeature {
|
||||
param (
|
||||
[string]$FeatureName
|
||||
)
|
||||
|
||||
$result = Invoke-NonBlocking -ScriptBlock {
|
||||
param($name)
|
||||
Enable-WindowsOptionalFeature -Online -FeatureName $name -All -NoRestart
|
||||
} -ArgumentList $FeatureName
|
||||
|
||||
$dismResult = @($result) | Where-Object { $_ -is [Microsoft.Dism.Commands.ImageObject] }
|
||||
if ($dismResult) {
|
||||
Write-Host ($dismResult | Out-String).Trim()
|
||||
}
|
||||
}
|
||||
69
Scripts/Features/ImportRegistryFile.ps1
Normal file
69
Scripts/Features/ImportRegistryFile.ps1
Normal file
@@ -0,0 +1,69 @@
|
||||
# Import & execute regfile
|
||||
function ImportRegistryFile {
|
||||
param (
|
||||
$message,
|
||||
$path
|
||||
)
|
||||
|
||||
Write-Host $message
|
||||
|
||||
# Validate that the regfile exists in both locations
|
||||
if (-not (Test-Path "$script:RegfilesPath\$path") -or -not (Test-Path "$script:RegfilesPath\Sysprep\$path")) {
|
||||
Write-Host "Error: Unable to find registry file: $path" -ForegroundColor Red
|
||||
Write-Host ""
|
||||
return
|
||||
}
|
||||
|
||||
# Reset exit code before running reg.exe for reliable success detection
|
||||
$global:LASTEXITCODE = 0
|
||||
|
||||
if ($script:Params.ContainsKey("Sysprep") -or $script:Params.ContainsKey("User")) {
|
||||
# Sysprep targets Default user, User targets the specified user
|
||||
$hiveDatPath = if ($script:Params.ContainsKey("Sysprep")) {
|
||||
GetUserDirectory -userName "Default" -fileName "NTUSER.DAT"
|
||||
} else {
|
||||
GetUserDirectory -userName $script:Params.Item("User") -fileName "NTUSER.DAT"
|
||||
}
|
||||
|
||||
$regResult = Invoke-NonBlocking -ScriptBlock {
|
||||
param($datPath, $regFilePath)
|
||||
$global:LASTEXITCODE = 0
|
||||
reg load "HKU\Default" $datPath | Out-Null
|
||||
$output = reg import $regFilePath 2>&1
|
||||
$code = $LASTEXITCODE
|
||||
reg unload "HKU\Default" | Out-Null
|
||||
return @{ Output = $output; ExitCode = $code }
|
||||
} -ArgumentList @($hiveDatPath, "$script:RegfilesPath\Sysprep\$path")
|
||||
}
|
||||
else {
|
||||
$regResult = Invoke-NonBlocking -ScriptBlock {
|
||||
param($regFilePath)
|
||||
$global:LASTEXITCODE = 0
|
||||
$output = reg import $regFilePath 2>&1
|
||||
return @{ Output = $output; ExitCode = $LASTEXITCODE }
|
||||
} -ArgumentList "$script:RegfilesPath\$path"
|
||||
}
|
||||
|
||||
$regOutput = $regResult.Output
|
||||
$hasSuccess = $regResult.ExitCode -eq 0
|
||||
|
||||
if ($regOutput) {
|
||||
foreach ($line in $regOutput) {
|
||||
$lineText = if ($line -is [System.Management.Automation.ErrorRecord]) { $line.Exception.Message } else { $line.ToString() }
|
||||
if ($lineText -and $lineText.Length -gt 0) {
|
||||
if ($hasSuccess) {
|
||||
Write-Host $lineText
|
||||
}
|
||||
else {
|
||||
Write-Host $lineText -ForegroundColor Red
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (-not $hasSuccess) {
|
||||
Write-Host "Failed importing registry file: $path" -ForegroundColor Red
|
||||
}
|
||||
|
||||
Write-Host ""
|
||||
}
|
||||
83
Scripts/Features/ReplaceStartMenu.ps1
Normal file
83
Scripts/Features/ReplaceStartMenu.ps1
Normal file
@@ -0,0 +1,83 @@
|
||||
# Replace the startmenu for all users, when using the default startmenuTemplate this clears all pinned apps
|
||||
# Credit: https://lazyadmin.nl/win-11/customize-windows-11-start-menu-layout/
|
||||
function ReplaceStartMenuForAllUsers {
|
||||
param (
|
||||
$startMenuTemplate = "$script:AssetsPath/Start/start2.bin"
|
||||
)
|
||||
|
||||
Write-Host "> Removing all pinned apps from the start menu for all users..."
|
||||
|
||||
# Check if template bin file exists
|
||||
if (-not (Test-Path $startMenuTemplate)) {
|
||||
Write-Host "Error: Unable to clear start menu, start2.bin file missing from script folder" -ForegroundColor Red
|
||||
Write-Host ""
|
||||
return
|
||||
}
|
||||
|
||||
# Get path to start menu file for all users
|
||||
$userPathString = GetUserDirectory -userName "*" -fileName "AppData\Local\Packages\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\LocalState"
|
||||
$usersStartMenuPaths = get-childitem -path $userPathString
|
||||
|
||||
# Go through all users and replace the start menu file
|
||||
ForEach ($startMenuPath in $usersStartMenuPaths) {
|
||||
ReplaceStartMenu $startMenuTemplate "$($startMenuPath.Fullname)\start2.bin"
|
||||
}
|
||||
|
||||
# Also replace the start menu file for the default user profile
|
||||
$defaultStartMenuPath = GetUserDirectory -userName "Default" -fileName "AppData\Local\Packages\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\LocalState" -exitIfPathNotFound $false
|
||||
|
||||
# Create folder if it doesn't exist
|
||||
if (-not (Test-Path $defaultStartMenuPath)) {
|
||||
new-item $defaultStartMenuPath -ItemType Directory -Force | Out-Null
|
||||
Write-Host "Created LocalState folder for default user profile"
|
||||
}
|
||||
|
||||
# Copy template to default profile
|
||||
Copy-Item -Path $startMenuTemplate -Destination $defaultStartMenuPath -Force
|
||||
Write-Host "Replaced start menu for the default user profile"
|
||||
Write-Host ""
|
||||
}
|
||||
|
||||
|
||||
# Replace the startmenu for all users, when using the default startmenuTemplate this clears all pinned apps
|
||||
# Credit: https://lazyadmin.nl/win-11/customize-windows-11-start-menu-layout/
|
||||
function ReplaceStartMenu {
|
||||
param (
|
||||
$startMenuTemplate = "$script:AssetsPath/Start/start2.bin",
|
||||
$startMenuBinFile = "$env:LOCALAPPDATA\Packages\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\LocalState\start2.bin"
|
||||
)
|
||||
|
||||
# Change path to correct user if a user was specified
|
||||
if ($script:Params.ContainsKey("User")) {
|
||||
$startMenuBinFile = GetUserDirectory -userName "$(GetUserName)" -fileName "AppData\Local\Packages\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\LocalState\start2.bin" -exitIfPathNotFound $false
|
||||
}
|
||||
|
||||
# Check if template bin file exists
|
||||
if (-not (Test-Path $startMenuTemplate)) {
|
||||
Write-Host "Error: Unable to replace start menu, template file not found" -ForegroundColor Red
|
||||
return
|
||||
}
|
||||
|
||||
if ([IO.Path]::GetExtension($startMenuTemplate) -ne ".bin" ) {
|
||||
Write-Host "Error: Unable to replace start menu, template file is not a valid .bin file" -ForegroundColor Red
|
||||
return
|
||||
}
|
||||
|
||||
$userName = [regex]::Match($startMenuBinFile, '(?:Users\\)([^\\]+)(?:\\AppData)').Groups[1].Value
|
||||
|
||||
$backupBinFile = $startMenuBinFile + ".bak"
|
||||
|
||||
if (Test-Path $startMenuBinFile) {
|
||||
# Backup current start menu file
|
||||
Move-Item -Path $startMenuBinFile -Destination $backupBinFile -Force
|
||||
}
|
||||
else {
|
||||
Write-Host "Unable to find original start2.bin file for user $userName, no backup was created for this user" -ForegroundColor Yellow
|
||||
New-Item -ItemType File -Path $startMenuBinFile -Force
|
||||
}
|
||||
|
||||
# Copy template file
|
||||
Copy-Item -Path $startMenuTemplate -Destination $startMenuBinFile -Force
|
||||
|
||||
Write-Host "Replaced start menu for user $userName"
|
||||
}
|
||||
26
Scripts/Features/RestartExplorer.ps1
Normal file
26
Scripts/Features/RestartExplorer.ps1
Normal file
@@ -0,0 +1,26 @@
|
||||
# Restart the Windows Explorer process
|
||||
function RestartExplorer {
|
||||
Write-Host "> Attempting to restart the Windows Explorer process to apply all changes..."
|
||||
|
||||
if ($script:Params.ContainsKey("Sysprep") -or $script:Params.ContainsKey("User") -or $script:Params.ContainsKey("NoRestartExplorer")) {
|
||||
Write-Host "Explorer process restart was skipped, please manually reboot your PC to apply all changes" -ForegroundColor Yellow
|
||||
return
|
||||
}
|
||||
|
||||
foreach ($paramKey in $script:Params.Keys) {
|
||||
if ($script:Features.ContainsKey($paramKey) -and $script:Features[$paramKey].RequiresReboot -eq $true) {
|
||||
$feature = $script:Features[$paramKey]
|
||||
Write-Host "Warning: '$($feature.Action) $($feature.Label)' requires a reboot to take full effect" -ForegroundColor Yellow
|
||||
}
|
||||
}
|
||||
|
||||
# Only restart if the powershell process matches the OS architecture.
|
||||
# Restarting explorer from a 32bit PowerShell window will fail on a 64bit OS
|
||||
if ([Environment]::Is64BitProcess -eq [Environment]::Is64BitOperatingSystem) {
|
||||
Write-Host "Restarting the Windows Explorer process... (This may cause your screen to flicker)"
|
||||
Stop-Process -processName: Explorer -Force
|
||||
}
|
||||
else {
|
||||
Write-Host "Unable to restart Windows Explorer process, please manually reboot your PC to apply all changes" -ForegroundColor Yellow
|
||||
}
|
||||
}
|
||||
@@ -28,11 +28,13 @@ function LoadAppsDetailsFromJson {
|
||||
}
|
||||
}
|
||||
|
||||
$friendlyName = if ($appData.FriendlyName) { $appData.FriendlyName } else { $appId }
|
||||
$displayName = if ($appData.FriendlyName) { "$($appData.FriendlyName) ($appId)" } else { $appId }
|
||||
$isChecked = if ($InitialCheckedFromJson) { $appData.SelectedByDefault } else { $false }
|
||||
|
||||
$apps += [PSCustomObject]@{
|
||||
AppId = $appId
|
||||
FriendlyName = $friendlyName
|
||||
DisplayName = $displayName
|
||||
IsChecked = $isChecked
|
||||
Description = $appData.Description
|
||||
|
||||
@@ -24,20 +24,13 @@ function ApplySettingsToUiControls {
|
||||
}
|
||||
}
|
||||
|
||||
# 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
|
||||
# Skip RestorePointCheckBox, this is always checked by default
|
||||
if ($paramName -eq 'CreateRestorePoint') {
|
||||
if ($restorePointCheckBox) { $restorePointCheckBox.IsChecked = $true }
|
||||
continue
|
||||
}
|
||||
|
||||
|
||||
@@ -30,6 +30,10 @@ function SetWindowThemeResources {
|
||||
$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")))
|
||||
$window.Resources.Add("AppIdColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#afafaf")))
|
||||
$window.Resources.Add("SearchHighlightColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#4A4A2A")))
|
||||
$window.Resources.Add("SearchHighlightActiveColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#8A7000")))
|
||||
$window.Resources.Add("TableHeaderColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#333333")))
|
||||
}
|
||||
else {
|
||||
$window.Resources.Add("BgColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#f3f3f3")))
|
||||
@@ -56,6 +60,10 @@ function SetWindowThemeResources {
|
||||
$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("AppIdColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#666666")))
|
||||
$window.Resources.Add("SearchHighlightColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#FFF4CE")))
|
||||
$window.Resources.Add("SearchHighlightActiveColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#FFD966")))
|
||||
$window.Resources.Add("TableHeaderColor", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#ffffff")))
|
||||
}
|
||||
|
||||
$window.Resources.Add("ButtonBg", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#0067c0")))
|
||||
@@ -66,4 +74,17 @@ function SetWindowThemeResources {
|
||||
$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")))
|
||||
|
||||
# Load and merge shared styles
|
||||
if ($script:SharedStylesSchema -and (Test-Path $script:SharedStylesSchema)) {
|
||||
$sharedXaml = Get-Content -Path $script:SharedStylesSchema -Raw
|
||||
$sharedReader = [System.Xml.XmlReader]::Create([System.IO.StringReader]::new($sharedXaml))
|
||||
try {
|
||||
$sharedDict = [System.Windows.Markup.XamlReader]::Load($sharedReader)
|
||||
$window.Resources.MergedDictionaries.Add($sharedDict)
|
||||
}
|
||||
finally {
|
||||
$sharedReader.Close()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
232
Scripts/GUI/Show-ApplyModal.ps1
Normal file
232
Scripts/GUI/Show-ApplyModal.ps1
Normal file
@@ -0,0 +1,232 @@
|
||||
function Show-ApplyModal {
|
||||
param (
|
||||
[Parameter(Mandatory=$false)]
|
||||
[System.Windows.Window]$Owner = $null,
|
||||
[Parameter(Mandatory=$false)]
|
||||
[bool]$RestartExplorer = $false
|
||||
)
|
||||
|
||||
Add-Type -AssemblyName PresentationFramework,PresentationCore,WindowsBase | Out-Null
|
||||
|
||||
# P/Invoke helpers for forcing focus back after Explorer restart
|
||||
if (-not ([System.Management.Automation.PSTypeName]'Win11Debloat.FocusHelper').Type) {
|
||||
Add-Type -Namespace Win11Debloat -Name FocusHelper -MemberDefinition @'
|
||||
[DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr hWnd);
|
||||
[DllImport("user32.dll")] public static extern IntPtr GetForegroundWindow();
|
||||
[DllImport("user32.dll")] public static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr lpdwProcessId);
|
||||
[DllImport("user32.dll")] public static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach);
|
||||
[DllImport("kernel32.dll")] public static extern uint GetCurrentThreadId();
|
||||
|
||||
public static void ForceActivate(IntPtr hwnd) {
|
||||
IntPtr fg = GetForegroundWindow();
|
||||
uint fgThread = GetWindowThreadProcessId(fg, IntPtr.Zero);
|
||||
uint myThread = GetCurrentThreadId();
|
||||
if (fgThread != myThread) AttachThreadInput(myThread, fgThread, true);
|
||||
SetForegroundWindow(hwnd);
|
||||
if (fgThread != myThread) AttachThreadInput(myThread, fgThread, false);
|
||||
}
|
||||
'@
|
||||
}
|
||||
|
||||
$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:ApplyChangesWindowSchema -Raw
|
||||
$reader = [System.Xml.XmlReader]::Create([System.IO.StringReader]::new($xaml))
|
||||
try {
|
||||
$applyWindow = [System.Windows.Markup.XamlReader]::Load($reader)
|
||||
}
|
||||
finally {
|
||||
$reader.Close()
|
||||
}
|
||||
|
||||
# Set owner to owner window if it exists
|
||||
if ($ownerWindow) {
|
||||
try {
|
||||
$applyWindow.Owner = $ownerWindow
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
|
||||
# Apply theme resources
|
||||
SetWindowThemeResources -window $applyWindow -usesDarkMode $usesDarkMode
|
||||
|
||||
# Get UI elements
|
||||
$script:ApplyInProgressPanel = $applyWindow.FindName('ApplyInProgressPanel')
|
||||
$script:ApplyCompletionPanel = $applyWindow.FindName('ApplyCompletionPanel')
|
||||
$script:ApplyStepNameEl = $applyWindow.FindName('ApplyStepName')
|
||||
$script:ApplyStepCounterEl = $applyWindow.FindName('ApplyStepCounter')
|
||||
$script:ApplyProgressBarEl = $applyWindow.FindName('ApplyProgressBar')
|
||||
$script:ApplyCompletionTitleEl = $applyWindow.FindName('ApplyCompletionTitle')
|
||||
$script:ApplyCompletionMessageEl = $applyWindow.FindName('ApplyCompletionMessage')
|
||||
$script:ApplyCompletionIconEl = $applyWindow.FindName('ApplyCompletionIcon')
|
||||
$applyRebootPanel = $applyWindow.FindName('ApplyRebootPanel')
|
||||
$applyRebootList = $applyWindow.FindName('ApplyRebootList')
|
||||
$applyCloseBtn = $applyWindow.FindName('ApplyCloseBtn')
|
||||
$applyKofiBtn = $applyWindow.FindName('ApplyKofiBtn')
|
||||
$applyCancelBtn = $applyWindow.FindName('ApplyCancelBtn')
|
||||
|
||||
# Initialize in-progress state
|
||||
$script:ApplyInProgressPanel.Visibility = 'Visible'
|
||||
$script:ApplyCompletionPanel.Visibility = 'Collapsed'
|
||||
$script:ApplyStepNameEl.Text = "Preparing..."
|
||||
$script:ApplyStepCounterEl.Text = "Preparing..."
|
||||
$script:ApplyProgressBarEl.Value = 0
|
||||
|
||||
# Set up progress callback for ExecuteAllChanges
|
||||
$script:ApplyProgressCallback = {
|
||||
param($currentStep, $totalSteps, $stepName)
|
||||
$script:ApplyStepNameEl.Text = $stepName
|
||||
$script:ApplyStepCounterEl.Text = "Step $currentStep of $totalSteps"
|
||||
# Store current step/total in Tag properties for sub-step interpolation
|
||||
$script:ApplyStepCounterEl.Tag = $currentStep
|
||||
$script:ApplyProgressBarEl.Tag = $totalSteps
|
||||
# Show progress at the start of each step (empty at step 1, full after last step completes)
|
||||
$pct = if ($totalSteps -gt 0) { [math]::Round((($currentStep - 1) / $totalSteps) * 100) } else { 0 }
|
||||
$script:ApplyProgressBarEl.Value = $pct
|
||||
# Process pending window messages to keep UI responsive
|
||||
DoEvents
|
||||
}
|
||||
|
||||
# Sub-step callback updates step name and interpolates progress bar within the current step
|
||||
$script:ApplySubStepCallback = {
|
||||
param($subStepName, $subIndex, $subCount)
|
||||
$script:ApplyStepNameEl.Text = $subStepName
|
||||
# Interpolate progress bar between previous step and current step
|
||||
$currentStep = [int]($script:ApplyStepCounterEl.Tag)
|
||||
$totalSteps = [int]($script:ApplyProgressBarEl.Tag)
|
||||
if ($totalSteps -gt 0 -and $subCount -gt 0) {
|
||||
$baseProgress = ($currentStep - 1) / $totalSteps
|
||||
$stepFraction = ($subIndex / $subCount) / $totalSteps
|
||||
$script:ApplyProgressBarEl.Value = [math]::Round(($baseProgress + $stepFraction) * 100)
|
||||
}
|
||||
DoEvents
|
||||
}
|
||||
|
||||
# Run changes in background to keep UI responsive
|
||||
$applyWindow.Dispatcher.BeginInvoke([System.Windows.Threading.DispatcherPriority]::Background, [action]{
|
||||
try {
|
||||
ExecuteAllChanges
|
||||
|
||||
# Restart explorer if requested
|
||||
if ($RestartExplorer -and -not $script:CancelRequested) {
|
||||
RestartExplorer
|
||||
|
||||
# Wait for Explorer to finish relaunching, then reclaim focus.
|
||||
Start-Sleep -Milliseconds 800
|
||||
$applyWindow.Dispatcher.Invoke([action]{
|
||||
$hwnd = (New-Object System.Windows.Interop.WindowInteropHelper($applyWindow)).Handle
|
||||
[Win11Debloat.FocusHelper]::ForceActivate($hwnd)
|
||||
})
|
||||
}
|
||||
|
||||
Write-Host ""
|
||||
if ($script:CancelRequested) {
|
||||
Write-Host "Script execution was cancelled by the user. Some changes may not have been applied."
|
||||
} else {
|
||||
Write-Host "All changes have been applied successfully!"
|
||||
}
|
||||
|
||||
# Show completion state
|
||||
$script:ApplyProgressBarEl.Value = 100
|
||||
$script:ApplyInProgressPanel.Visibility = 'Collapsed'
|
||||
$script:ApplyCompletionPanel.Visibility = 'Visible'
|
||||
|
||||
if ($script:CancelRequested) {
|
||||
$script:ApplyCompletionIconEl.Text = [char]0xE7BA
|
||||
$script:ApplyCompletionIconEl.Foreground = [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#e8912d"))
|
||||
$script:ApplyCompletionTitleEl.Text = "Cancelled"
|
||||
$script:ApplyCompletionMessageEl.Text = "Script execution was cancelled by the user."
|
||||
} else {
|
||||
$script:ApplyCompletionTitleEl.Text = "Changes Applied"
|
||||
|
||||
# Show completion message with reboot instructions if any applied features require reboot
|
||||
if ($RestartExplorer) {
|
||||
$rebootFeatures = @()
|
||||
foreach ($paramKey in $script:Params.Keys) {
|
||||
if ($script:Features.ContainsKey($paramKey) -and $script:Features[$paramKey].RequiresReboot -eq $true) {
|
||||
$feature = $script:Features[$paramKey]
|
||||
$rebootFeatures += "$($feature.Action) $($feature.Label)"
|
||||
}
|
||||
}
|
||||
|
||||
if ($rebootFeatures.Count -gt 0) {
|
||||
foreach ($featureName in $rebootFeatures) {
|
||||
$tb = [System.Windows.Controls.TextBlock]::new()
|
||||
$tb.Text = "$([char]0x2022) $featureName"
|
||||
$tb.FontSize = 12
|
||||
$tb.SetResourceReference([System.Windows.Controls.TextBlock]::ForegroundProperty, 'FgColor')
|
||||
$tb.Opacity = 0.85
|
||||
$tb.Margin = [System.Windows.Thickness]::new(0, 2, 0, 0)
|
||||
$applyRebootList.Children.Add($tb) | Out-Null
|
||||
}
|
||||
$applyRebootPanel.Visibility = 'Visible'
|
||||
}
|
||||
else {
|
||||
$script:ApplyCompletionMessageEl.Text = "Your clean system is ready. Thanks for using Win11Debloat!"
|
||||
}
|
||||
}
|
||||
}
|
||||
$applyWindow.Dispatcher.Invoke([System.Windows.Threading.DispatcherPriority]::Render, [action]{})
|
||||
}
|
||||
catch {
|
||||
Write-Host "Error: $($_.Exception.Message)"
|
||||
$script:ApplyInProgressPanel.Visibility = 'Collapsed'
|
||||
$script:ApplyCompletionPanel.Visibility = 'Visible'
|
||||
$script:ApplyCompletionIconEl.Text = [char]0xEA39
|
||||
$script:ApplyCompletionIconEl.Foreground = [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#c42b1c"))
|
||||
$script:ApplyCompletionTitleEl.Text = "Error"
|
||||
$script:ApplyCompletionMessageEl.Text = "An error occurred while applying changes: $($_.Exception.Message)"
|
||||
$applyWindow.Dispatcher.Invoke([System.Windows.Threading.DispatcherPriority]::Render, [action]{})
|
||||
}
|
||||
finally {
|
||||
$script:ApplyProgressCallback = $null
|
||||
$script:ApplySubStepCallback = $null
|
||||
}
|
||||
})
|
||||
|
||||
# Button handlers
|
||||
$applyCloseBtn.Add_Click({
|
||||
$applyWindow.Close()
|
||||
})
|
||||
|
||||
$applyKofiBtn.Add_Click({
|
||||
Start-Process "https://ko-fi.com/raphire"
|
||||
})
|
||||
|
||||
$applyCancelBtn.Add_Click({
|
||||
if ($script:ApplyCompletionPanel.Visibility -eq 'Visible') {
|
||||
# Completion state - just close
|
||||
$applyWindow.Close()
|
||||
} else {
|
||||
# In-progress state - request cancellation
|
||||
$script:CancelRequested = $true
|
||||
}
|
||||
})
|
||||
|
||||
# Show dialog
|
||||
$applyWindow.ShowDialog() | Out-Null
|
||||
|
||||
# Hide overlay after dialog closes
|
||||
if ($overlay) {
|
||||
try {
|
||||
$ownerWindow.Dispatcher.Invoke([action]{ $overlay.Visibility = 'Collapsed' })
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
}
|
||||
@@ -221,15 +221,7 @@ function Show-MainWindow {
|
||||
$script:CurrentAppLoadJob = $null
|
||||
$script:CurrentAppLoadJobStartTime = $null
|
||||
|
||||
# Apply Tab UI Elements
|
||||
$consoleOutput = $window.FindName('ConsoleOutput')
|
||||
$consoleScrollViewer = $window.FindName('ConsoleScrollViewer')
|
||||
$finishBtn = $window.FindName('FinishBtn')
|
||||
$finishBtnText = $window.FindName('FinishBtnText')
|
||||
|
||||
# Set script-level variables for Write-ToConsole function
|
||||
$script:GuiConsoleOutput = $consoleOutput
|
||||
$script:GuiConsoleScrollViewer = $consoleScrollViewer
|
||||
# Set script-level variable for GUI window reference
|
||||
$script:GuiWindow = $window
|
||||
|
||||
# Updates app selection status text in the App Selection tab
|
||||
@@ -534,16 +526,45 @@ function Show-MainWindow {
|
||||
$script:MainWindowLastSelectedCheckbox = $null
|
||||
|
||||
# Sort apps alphabetically and add to panel
|
||||
$appsToAdd | Sort-Object -Property DisplayName | ForEach-Object {
|
||||
$appsToAdd | Sort-Object -Property FriendlyName | ForEach-Object {
|
||||
$checkbox = New-Object System.Windows.Controls.CheckBox
|
||||
$checkbox.Content = $_.DisplayName
|
||||
$checkbox.SetValue([System.Windows.Automation.AutomationProperties]::NameProperty, $_.DisplayName)
|
||||
$checkbox.SetValue([System.Windows.Automation.AutomationProperties]::NameProperty, $_.FriendlyName)
|
||||
$checkbox.Tag = $_.AppId
|
||||
$checkbox.IsChecked = $_.IsChecked
|
||||
$checkbox.ToolTip = $_.Description
|
||||
$checkbox.Style = $window.Resources["AppsPanelCheckBoxStyle"]
|
||||
|
||||
|
||||
# Build table row content: App Name | Description | App ID
|
||||
$row = New-Object System.Windows.Controls.Grid
|
||||
$c0 = New-Object System.Windows.Controls.ColumnDefinition; $c0.Width = [System.Windows.GridLength]::new(160)
|
||||
$c1 = New-Object System.Windows.Controls.ColumnDefinition; $c1.Width = [System.Windows.GridLength]::new(1, [System.Windows.GridUnitType]::Star)
|
||||
$c2 = New-Object System.Windows.Controls.ColumnDefinition; $c2.Width = [System.Windows.GridLength]::new(286)
|
||||
$row.ColumnDefinitions.Add($c0); $row.ColumnDefinitions.Add($c1); $row.ColumnDefinitions.Add($c2)
|
||||
|
||||
$tbName = New-Object System.Windows.Controls.TextBlock
|
||||
$tbName.Text = $_.FriendlyName
|
||||
$tbName.Style = $window.Resources["AppNameTextStyle"]
|
||||
[System.Windows.Controls.Grid]::SetColumn($tbName, 0)
|
||||
|
||||
$tbDesc = New-Object System.Windows.Controls.TextBlock
|
||||
$tbDesc.Text = $_.Description
|
||||
$tbDesc.Style = $window.Resources["AppDescTextStyle"]
|
||||
$tbDesc.ToolTip = $_.Description
|
||||
[System.Windows.Controls.Grid]::SetColumn($tbDesc, 1)
|
||||
|
||||
$tbId = New-Object System.Windows.Controls.TextBlock
|
||||
$tbId.Text = $_.AppId
|
||||
$tbId.Style = $window.Resources["AppIdTextStyle"]
|
||||
$tbId.ToolTip = $_.AppId
|
||||
[System.Windows.Controls.Grid]::SetColumn($tbId, 2)
|
||||
|
||||
$row.Children.Add($tbName) | Out-Null
|
||||
$row.Children.Add($tbDesc) | Out-Null
|
||||
$row.Children.Add($tbId) | Out-Null
|
||||
$checkbox.Content = $row
|
||||
|
||||
# Store metadata in checkbox for later use
|
||||
Add-Member -InputObject $checkbox -MemberType NoteProperty -Name "AppName" -Value $_.FriendlyName
|
||||
Add-Member -InputObject $checkbox -MemberType NoteProperty -Name "AppDescription" -Value $_.Description
|
||||
Add-Member -InputObject $checkbox -MemberType NoteProperty -Name "SelectedByDefault" -Value $_.SelectedByDefault
|
||||
|
||||
# Add event handler to update status
|
||||
@@ -674,16 +695,6 @@ function Show-MainWindow {
|
||||
}
|
||||
})
|
||||
|
||||
# Shared search highlighting configuration
|
||||
$script:SearchHighlightColor = [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#FFF4CE"))
|
||||
$script:SearchHighlightColorDark = [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString("#4A4A2A"))
|
||||
|
||||
# Helper function to get the appropriate highlight brush based on theme
|
||||
function GetSearchHighlightBrush {
|
||||
if ($usesDarkMode) { return $script:SearchHighlightColorDark }
|
||||
return $script:SearchHighlightColor
|
||||
}
|
||||
|
||||
# Helper function to scroll to an item if it's not visible, centering it in the viewport
|
||||
function ScrollToItemIfNotVisible {
|
||||
param (
|
||||
@@ -737,6 +748,10 @@ function Show-MainWindow {
|
||||
$appSearchBox = $window.FindName('AppSearchBox')
|
||||
$appSearchPlaceholder = $window.FindName('AppSearchPlaceholder')
|
||||
|
||||
# Track current search matches and active index for Enter-key navigation
|
||||
$script:AppSearchMatches = @()
|
||||
$script:AppSearchMatchIndex = -1
|
||||
|
||||
$appSearchBox.Add_TextChanged({
|
||||
$searchText = $appSearchBox.Text.ToLower().Trim()
|
||||
|
||||
@@ -750,29 +765,54 @@ function Show-MainWindow {
|
||||
}
|
||||
}
|
||||
|
||||
$script:AppSearchMatches = @()
|
||||
$script:AppSearchMatchIndex = -1
|
||||
|
||||
if ([string]::IsNullOrWhiteSpace($searchText)) { return }
|
||||
|
||||
# Find and highlight all matching apps
|
||||
$firstMatch = $null
|
||||
$highlightBrush = GetSearchHighlightBrush
|
||||
$highlightBrush = $window.Resources["SearchHighlightColor"]
|
||||
$activeHighlightBrush = $window.Resources["SearchHighlightActiveColor"]
|
||||
|
||||
foreach ($child in $appsPanel.Children) {
|
||||
if ($child -is [System.Windows.Controls.CheckBox] -and $child.Visibility -eq 'Visible') {
|
||||
if ($child.Content.ToString().ToLower().Contains($searchText)) {
|
||||
$appName = if ($child.AppName) { $child.AppName } else { '' }
|
||||
$appId = if ($child.Tag) { $child.Tag.ToString() } else { '' }
|
||||
$appDesc = if ($child.AppDescription) { $child.AppDescription } else { '' }
|
||||
if ($appName.ToLower().Contains($searchText) -or $appId.ToLower().Contains($searchText) -or $appDesc.ToLower().Contains($searchText)) {
|
||||
$child.Background = $highlightBrush
|
||||
if ($null -eq $firstMatch) { $firstMatch = $child }
|
||||
$script:AppSearchMatches += $child
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Scroll to first match if not visible
|
||||
if ($firstMatch) {
|
||||
# Scroll to first match and mark it as active
|
||||
if ($script:AppSearchMatches.Count -gt 0) {
|
||||
$script:AppSearchMatchIndex = 0
|
||||
$script:AppSearchMatches[0].Background = $activeHighlightBrush
|
||||
$scrollViewer = FindParentScrollViewer -element $appsPanel
|
||||
if ($scrollViewer) {
|
||||
ScrollToItemIfNotVisible -scrollViewer $scrollViewer -item $firstMatch -container $appsPanel
|
||||
ScrollToItemIfNotVisible -scrollViewer $scrollViewer -item $script:AppSearchMatches[0] -container $appsPanel
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
$appSearchBox.Add_KeyDown({
|
||||
param($sender, $e)
|
||||
if ($e.Key -eq [System.Windows.Input.Key]::Enter -and $script:AppSearchMatches.Count -gt 0) {
|
||||
# Reset background of current active match
|
||||
$script:AppSearchMatches[$script:AppSearchMatchIndex].Background = $window.Resources["SearchHighlightColor"]
|
||||
# Advance to next match (wrapping)
|
||||
$script:AppSearchMatchIndex = ($script:AppSearchMatchIndex + 1) % $script:AppSearchMatches.Count
|
||||
# Highlight new active match
|
||||
$script:AppSearchMatches[$script:AppSearchMatchIndex].Background = $window.Resources["SearchHighlightActiveColor"]
|
||||
$scrollViewer = FindParentScrollViewer -element $appsPanel
|
||||
if ($scrollViewer) {
|
||||
ScrollToItemIfNotVisible -scrollViewer $scrollViewer -item $script:AppSearchMatches[$script:AppSearchMatchIndex] -container $appsPanel
|
||||
}
|
||||
$e.Handled = $true
|
||||
}
|
||||
})
|
||||
|
||||
# Tweak Search Box functionality
|
||||
$tweakSearchBox = $window.FindName('TweakSearchBox')
|
||||
@@ -835,7 +875,7 @@ function Show-MainWindow {
|
||||
|
||||
# Find and highlight all matching tweaks
|
||||
$firstMatch = $null
|
||||
$highlightBrush = GetSearchHighlightBrush
|
||||
$highlightBrush = $window.Resources["SearchHighlightColor"]
|
||||
$columns = @($col0, $col1, $col2) | Where-Object { $_ -ne $null }
|
||||
|
||||
foreach ($column in $columns) {
|
||||
@@ -924,8 +964,7 @@ function Show-MainWindow {
|
||||
$totalTabs = $tabControl.Items.Count
|
||||
|
||||
$homeIndex = 0
|
||||
$overviewIndex = $totalTabs - 2
|
||||
$applyIndex = $totalTabs - 1
|
||||
$overviewIndex = $totalTabs - 1
|
||||
|
||||
# Navigation button visibility
|
||||
if ($currentIndex -eq $homeIndex) {
|
||||
@@ -934,26 +973,23 @@ function Show-MainWindow {
|
||||
} elseif ($currentIndex -eq $overviewIndex) {
|
||||
$nextBtn.Visibility = 'Collapsed'
|
||||
$previousBtn.Visibility = 'Visible'
|
||||
} elseif ($currentIndex -eq $applyIndex) {
|
||||
$nextBtn.Visibility = 'Collapsed'
|
||||
$previousBtn.Visibility = 'Collapsed'
|
||||
} else {
|
||||
$nextBtn.Visibility = 'Visible'
|
||||
$previousBtn.Visibility = 'Visible'
|
||||
}
|
||||
|
||||
# Update progress indicators
|
||||
# Tab indices: 0=Home, 1=App Removal, 2=Tweaks, 3=Overview, 4=Apply
|
||||
# Tab indices: 0=Home, 1=App Removal, 2=Tweaks, 3=Deployment Settings
|
||||
$blueColor = "#0067c0"
|
||||
$greyColor = "#808080"
|
||||
|
||||
$progressIndicator1 = $window.FindName('ProgressIndicator1') # App Removal
|
||||
$progressIndicator2 = $window.FindName('ProgressIndicator2') # Tweaks
|
||||
$progressIndicator3 = $window.FindName('ProgressIndicator3') # Overview
|
||||
$progressIndicator3 = $window.FindName('ProgressIndicator3') # Deployment Settings
|
||||
$bottomNavGrid = $window.FindName('BottomNavGrid')
|
||||
|
||||
# Hide bottom navigation on home page and apply tab
|
||||
if ($currentIndex -eq 0 -or $currentIndex -eq $applyIndex) {
|
||||
# Hide bottom navigation on home page
|
||||
if ($currentIndex -eq 0) {
|
||||
$bottomNavGrid.Visibility = 'Collapsed'
|
||||
} else {
|
||||
$bottomNavGrid.Visibility = 'Visible'
|
||||
@@ -974,7 +1010,7 @@ function Show-MainWindow {
|
||||
$progressIndicator2.Fill = $greyColor
|
||||
}
|
||||
|
||||
# Indicator 3 (Overview) - tab index 3
|
||||
# Indicator 3 (Deployment Settings) - tab index 3
|
||||
if ($currentIndex -ge 3) {
|
||||
$progressIndicator3.Fill = $blueColor
|
||||
} else {
|
||||
@@ -1094,8 +1130,6 @@ function Show-MainWindow {
|
||||
function GenerateOverview {
|
||||
# Load Features.json
|
||||
$featuresJson = LoadJsonFile -filePath $script:FeaturesFilePath -expectedVersion "1.0"
|
||||
$overviewChangesPanel = $window.FindName('OverviewChangesPanel')
|
||||
$overviewChangesPanel.Children.Clear()
|
||||
|
||||
$changesList = @()
|
||||
|
||||
@@ -1107,7 +1141,7 @@ function Show-MainWindow {
|
||||
}
|
||||
}
|
||||
if ($selectedAppsCount -gt 0) {
|
||||
$changesList += "Remove $selectedAppsCount selected application(s)"
|
||||
$changesList += "Remove $selectedAppsCount application(s)"
|
||||
}
|
||||
|
||||
# Update app removal scope section based on whether apps are selected
|
||||
@@ -1158,20 +1192,19 @@ function Show-MainWindow {
|
||||
}
|
||||
}
|
||||
|
||||
return $changesList
|
||||
}
|
||||
|
||||
function ShowChangesOverview {
|
||||
$changesList = GenerateOverview
|
||||
|
||||
if ($changesList.Count -eq 0) {
|
||||
$textBlock = New-Object System.Windows.Controls.TextBlock
|
||||
$textBlock.Text = "No changes selected"
|
||||
$textBlock.Style = $window.Resources["OverviewNoChangesTextStyle"]
|
||||
$overviewChangesPanel.Children.Add($textBlock) | Out-Null
|
||||
}
|
||||
else {
|
||||
foreach ($change in $changesList) {
|
||||
$bullet = New-Object System.Windows.Controls.TextBlock
|
||||
$bullet.Text = "- $change"
|
||||
$bullet.Style = $window.Resources["OverviewChangeBulletStyle"]
|
||||
$overviewChangesPanel.Children.Add($bullet) | Out-Null
|
||||
}
|
||||
Show-MessageBox -Message 'No changes have been selected.' -Title 'Selected Changes' -Button 'OK' -Icon 'Information'
|
||||
return
|
||||
}
|
||||
|
||||
$message = ($changesList | ForEach-Object { "$([char]0x2022) $_" }) -join "`n"
|
||||
Show-MessageBox -Message $message -Title 'Selected Changes' -Button 'OK' -Icon 'None' -Width 600
|
||||
}
|
||||
|
||||
$previousBtn.Add_Click({
|
||||
@@ -1197,9 +1230,36 @@ function Show-MainWindow {
|
||||
UpdateNavigationButtons
|
||||
})
|
||||
|
||||
# Handle Overview Apply Changes button - validates and immediately starts applying changes
|
||||
$overviewApplyBtn = $window.FindName('OverviewApplyBtn')
|
||||
$overviewApplyBtn.Add_Click({
|
||||
# Handle Home Default Mode button - apply defaults and navigate directly to overview
|
||||
$homeDefaultModeBtn = $window.FindName('HomeDefaultModeBtn')
|
||||
$homeDefaultModeBtn.Add_Click({
|
||||
# Load and apply default settings
|
||||
$defaultsJson = LoadJsonFile -filePath $script:DefaultSettingsFilePath -expectedVersion "1.0"
|
||||
if ($defaultsJson) {
|
||||
ApplySettingsToUiControls -window $window -settingsJson $defaultsJson -uiControlMappings $script:UiControlMappings
|
||||
}
|
||||
|
||||
# Select default apps
|
||||
foreach ($child in $appsPanel.Children) {
|
||||
if ($child -is [System.Windows.Controls.CheckBox]) {
|
||||
$child.IsChecked = ($child.SelectedByDefault -eq $true)
|
||||
}
|
||||
}
|
||||
|
||||
# Navigate directly to the Deployment Settings tab
|
||||
$tabControl.SelectedIndex = 3
|
||||
UpdateNavigationButtons
|
||||
})
|
||||
|
||||
# Handle Review Changes link button
|
||||
$reviewChangesBtn = $window.FindName('ReviewChangesBtn')
|
||||
$reviewChangesBtn.Add_Click({
|
||||
ShowChangesOverview
|
||||
})
|
||||
|
||||
# Handle Apply Changes button - validates and immediately starts applying changes
|
||||
$deploymentApplyBtn = $window.FindName('DeploymentApplyBtn')
|
||||
$deploymentApplyBtn.Add_Click({
|
||||
if (-not (ValidateOtherUsername)) {
|
||||
Show-MessageBox -Message "Please enter a valid username." -Title "Invalid Username" -Button 'OK' -Icon 'Warning' | Out-Null
|
||||
return
|
||||
@@ -1312,47 +1372,15 @@ function Show-MainWindow {
|
||||
|
||||
SaveSettings
|
||||
|
||||
# Navigate to Apply tab (last tab) and start applying changes
|
||||
$tabControl.SelectedIndex = $tabControl.Items.Count - 1
|
||||
|
||||
# Clear console and set initial status
|
||||
$consoleOutput.Text = ""
|
||||
# Check if user wants to restart explorer
|
||||
$restartExplorerCheckBox = $window.FindName('RestartExplorerCheckBox')
|
||||
$shouldRestartExplorer = $restartExplorerCheckBox -and $restartExplorerCheckBox.IsChecked
|
||||
|
||||
Write-ToConsole "Applying changes to $(if ($script:Params.ContainsKey("Sysprep")) { "default user template" } else { "user $(GetUserName)" })"
|
||||
Write-ToConsole "Total changes to apply: $totalChanges"
|
||||
Write-ToConsole ""
|
||||
|
||||
# Run changes in background to keep UI responsive
|
||||
$window.Dispatcher.BeginInvoke([System.Windows.Threading.DispatcherPriority]::Background, [action]{
|
||||
try {
|
||||
ExecuteAllChanges
|
||||
|
||||
# Check if user wants to restart explorer (from checkbox)
|
||||
$restartExplorerCheckBox = $window.FindName('RestartExplorerCheckBox')
|
||||
if ($restartExplorerCheckBox -and $restartExplorerCheckBox.IsChecked -and -not $script:CancelRequested) {
|
||||
RestartExplorer
|
||||
}
|
||||
|
||||
Write-ToConsole ""
|
||||
if ($script:CancelRequested) {
|
||||
Write-ToConsole "Script execution was cancelled by the user. Some changes may not have been applied."
|
||||
} else {
|
||||
Write-ToConsole "All changes have been applied. Please check the output above for any errors."
|
||||
}
|
||||
|
||||
$finishBtn.Dispatcher.Invoke([action]{
|
||||
$finishBtn.IsEnabled = $true
|
||||
$finishBtnText.Text = "Close Win11Debloat"
|
||||
})
|
||||
}
|
||||
catch {
|
||||
Write-ToConsole "Error: $($_.Exception.Message)"
|
||||
$finishBtn.Dispatcher.Invoke([action]{
|
||||
$finishBtn.IsEnabled = $true
|
||||
$finishBtnText.Text = "Close Win11Debloat"
|
||||
})
|
||||
}
|
||||
})
|
||||
# Show the apply changes window
|
||||
Show-ApplyModal -Owner $window -RestartExplorer $shouldRestartExplorer
|
||||
|
||||
# Close the main window after the apply dialog closes
|
||||
$window.Close()
|
||||
})
|
||||
|
||||
# Initialize UI elements on window load
|
||||
@@ -1483,17 +1511,6 @@ function Show-MainWindow {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Also uncheck RestorePointCheckBox
|
||||
$restorePointCheckBox = $window.FindName('RestorePointCheckBox')
|
||||
if ($restorePointCheckBox) {
|
||||
$restorePointCheckBox.IsChecked = $false
|
||||
}
|
||||
})
|
||||
|
||||
# Finish (Close Win11Debloat) button handler
|
||||
$finishBtn.Add_Click({
|
||||
$window.Close()
|
||||
})
|
||||
|
||||
# Show the window
|
||||
|
||||
@@ -16,7 +16,10 @@ function Show-MessageBox {
|
||||
[string]$Icon = 'None',
|
||||
|
||||
[Parameter(Mandatory=$false)]
|
||||
[System.Windows.Window]$Owner = $null
|
||||
[System.Windows.Window]$Owner = $null,
|
||||
|
||||
[Parameter(Mandatory=$false)]
|
||||
[int]$Width = 0
|
||||
)
|
||||
|
||||
Add-Type -AssemblyName PresentationFramework,PresentationCore,WindowsBase | Out-Null
|
||||
@@ -28,11 +31,15 @@ function Show-MessageBox {
|
||||
|
||||
# Show overlay if owner window exists
|
||||
$overlay = $null
|
||||
$overlayWasAlreadyVisible = $false
|
||||
if ($ownerWindow) {
|
||||
try {
|
||||
$overlay = $ownerWindow.FindName('ModalOverlay')
|
||||
if ($overlay) {
|
||||
$ownerWindow.Dispatcher.Invoke([action]{ $overlay.Visibility = 'Visible' })
|
||||
$overlayWasAlreadyVisible = ($overlay.Visibility -eq 'Visible')
|
||||
if (-not $overlayWasAlreadyVisible) {
|
||||
$ownerWindow.Dispatcher.Invoke([action]{ $overlay.Visibility = 'Visible' })
|
||||
}
|
||||
}
|
||||
}
|
||||
catch { }
|
||||
@@ -56,6 +63,11 @@ function Show-MessageBox {
|
||||
catch { }
|
||||
}
|
||||
|
||||
# Apply custom width if specified
|
||||
if ($Width -gt 0) {
|
||||
$msgWindow.Width = $Width
|
||||
}
|
||||
|
||||
# Apply theme resources
|
||||
SetWindowThemeResources -window $msgWindow -usesDarkMode $usesDarkMode
|
||||
|
||||
@@ -142,8 +154,8 @@ function Show-MessageBox {
|
||||
# Show dialog and return result from Tag
|
||||
$msgWindow.ShowDialog() | Out-Null
|
||||
|
||||
# Hide overlay after dialog closes
|
||||
if ($overlay) {
|
||||
# Hide overlay after dialog closes (only if this dialog was the one that showed it)
|
||||
if ($overlay -and -not $overlayWasAlreadyVisible) {
|
||||
try {
|
||||
$ownerWindow.Dispatcher.Invoke([action]{ $overlay.Visibility = 'Collapsed' })
|
||||
}
|
||||
|
||||
@@ -22,17 +22,24 @@ param (
|
||||
[switch]$ForceRemoveEdge,
|
||||
[switch]$DisableDVR,
|
||||
[switch]$DisableGameBarIntegration,
|
||||
[switch]$EnableWindowsSandbox,
|
||||
[switch]$EnableWindowsSubsystemForLinux,
|
||||
[switch]$DisableTelemetry,
|
||||
[switch]$DisableSearchHistory,
|
||||
[switch]$DisableFastStartup,
|
||||
[switch]$DisableBitlockerAutoEncryption,
|
||||
[switch]$DisableModernStandbyNetworking,
|
||||
[switch]$DisableStorageSense,
|
||||
[switch]$DisableUpdateASAP,
|
||||
[switch]$PreventUpdateAutoReboot,
|
||||
[switch]$DisableDeliveryOptimization,
|
||||
[switch]$DisableBing,
|
||||
[switch]$DisableStoreSearchSuggestions,
|
||||
[switch]$DisableDesktopSpotlight,
|
||||
[switch]$DisableLockscreenTips,
|
||||
[switch]$DisableSuggestions,
|
||||
[switch]$DisableLocationServices,
|
||||
[switch]$DisableFindMyDevice,
|
||||
[switch]$DisableEdgeAds,
|
||||
[switch]$DisableBraveBloat,
|
||||
[switch]$DisableSettings365Ads,
|
||||
@@ -54,9 +61,11 @@ param (
|
||||
[switch]$DisableCopilot,
|
||||
[switch]$DisableRecall,
|
||||
[switch]$DisableClickToDo,
|
||||
[switch]$DisableAISvcAutoStart,
|
||||
[switch]$DisablePaintAI,
|
||||
[switch]$DisableNotepadAI,
|
||||
[switch]$DisableEdgeAI,
|
||||
[switch]$DisableSearchHighlights,
|
||||
[switch]$DisableWidgets,
|
||||
[switch]$HideChat,
|
||||
[switch]$EnableEndTask,
|
||||
|
||||
682
Win11Debloat.ps1
682
Win11Debloat.ps1
@@ -24,17 +24,25 @@ param (
|
||||
[switch]$ForceRemoveEdge,
|
||||
[switch]$DisableDVR,
|
||||
[switch]$DisableGameBarIntegration,
|
||||
[switch]$EnableWindowsSandbox,
|
||||
[switch]$EnableWindowsSubsystemForLinux,
|
||||
[switch]$DisableTelemetry,
|
||||
[switch]$DisableSearchHistory,
|
||||
[switch]$DisableFastStartup,
|
||||
[switch]$DisableBitlockerAutoEncryption,
|
||||
[switch]$DisableModernStandbyNetworking,
|
||||
[switch]$DisableStorageSense,
|
||||
[switch]$DisableUpdateASAP,
|
||||
[switch]$PreventUpdateAutoReboot,
|
||||
[switch]$DisableDeliveryOptimization,
|
||||
[switch]$DisableBing,
|
||||
[switch]$DisableStoreSearchSuggestions,
|
||||
[switch]$DisableSearchHighlights,
|
||||
[switch]$DisableDesktopSpotlight,
|
||||
[switch]$DisableLockscreenTips,
|
||||
[switch]$DisableSuggestions,
|
||||
[switch]$DisableLocationServices,
|
||||
[switch]$DisableFindMyDevice,
|
||||
[switch]$DisableEdgeAds,
|
||||
[switch]$DisableBraveBloat,
|
||||
[switch]$DisableSettings365Ads,
|
||||
@@ -56,6 +64,7 @@ param (
|
||||
[switch]$DisableCopilot,
|
||||
[switch]$DisableRecall,
|
||||
[switch]$DisableClickToDo,
|
||||
[switch]$DisableAISvcAutoStart,
|
||||
[switch]$DisablePaintAI,
|
||||
[switch]$DisableNotepadAI,
|
||||
[switch]$DisableEdgeAI,
|
||||
@@ -93,7 +102,7 @@ param (
|
||||
|
||||
|
||||
# Define script-level variables & paths
|
||||
$script:Version = "2026.02.15"
|
||||
$script:Version = "2026.03.07"
|
||||
$script:DefaultSettingsFilePath = "$PSScriptRoot/DefaultSettings.json"
|
||||
$script:AppsListFilePath = "$PSScriptRoot/Apps.json"
|
||||
$script:SavedSettingsFilePath = "$PSScriptRoot/LastUsedSettings.json"
|
||||
@@ -105,15 +114,17 @@ $script:AppSelectionSchema = "$PSScriptRoot/Schemas/AppSelectionWindow.xaml"
|
||||
$script:MainWindowSchema = "$PSScriptRoot/Schemas/MainWindow.xaml"
|
||||
$script:MessageBoxSchema = "$PSScriptRoot/Schemas/MessageBoxWindow.xaml"
|
||||
$script:AboutWindowSchema = "$PSScriptRoot/Schemas/AboutWindow.xaml"
|
||||
$script:ApplyChangesWindowSchema = "$PSScriptRoot/Schemas/ApplyChangesWindow.xaml"
|
||||
$script:SharedStylesSchema = "$PSScriptRoot/Schemas/SharedStyles.xaml"
|
||||
$script:FeaturesFilePath = "$script:AssetsPath/Features.json"
|
||||
|
||||
$script:ControlParams = 'WhatIf', 'Confirm', 'Verbose', 'Debug', 'LogPath', 'Silent', 'Sysprep', 'User', 'NoRestartExplorer', 'RunDefaults', 'RunDefaultsLite', 'RunSavedSettings', 'RunAppsListGenerator', 'CLI', 'AppRemovalTarget'
|
||||
|
||||
# Script-level variables for GUI elements
|
||||
$script:GuiConsoleOutput = $null
|
||||
$script:GuiConsoleScrollViewer = $null
|
||||
$script:GuiWindow = $null
|
||||
$script:CancelRequested = $false
|
||||
$script:ApplyProgressCallback = $null
|
||||
$script:ApplySubStepCallback = $null
|
||||
|
||||
# Check if current powershell environment is limited by security policies
|
||||
if ($ExecutionContext.SessionState.LanguageMode -ne "FullLanguage") {
|
||||
@@ -155,7 +166,7 @@ else {
|
||||
}
|
||||
|
||||
# Check if script has all required files
|
||||
if (-not ((Test-Path $script:DefaultSettingsFilePath) -and (Test-Path $script:AppsListFilePath) -and (Test-Path $script:RegfilesPath) -and (Test-Path $script:AssetsPath) -and (Test-Path $script:AppSelectionSchema) -and (Test-Path $script:FeaturesFilePath))) {
|
||||
if (-not ((Test-Path $script:DefaultSettingsFilePath) -and (Test-Path $script:AppsListFilePath) -and (Test-Path $script:RegfilesPath) -and (Test-Path $script:AssetsPath) -and (Test-Path $script:AppSelectionSchema) -and (Test-Path $script:ApplyChangesWindowSchema) -and (Test-Path $script:SharedStylesSchema) -and (Test-Path $script:FeaturesFilePath))) {
|
||||
Write-Error "Win11Debloat is unable to find required files, please ensure all script files are present"
|
||||
Write-Output ""
|
||||
Write-Output "Press any key to exit..."
|
||||
@@ -181,7 +192,7 @@ catch {
|
||||
|
||||
# Check if WinGet is installed & if it is, check if the version is at least v1.4
|
||||
try {
|
||||
if ([int](((winget -v) -replace 'v','').split('.')[0..1] -join '') -gt 14) {
|
||||
if (Get-Command winget -ErrorAction SilentlyContinue) {
|
||||
$script:WingetInstalled = $true
|
||||
}
|
||||
else {
|
||||
@@ -189,6 +200,7 @@ try {
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Error "Unable to determine if WinGet is installed, winget command failed: $_"
|
||||
$script:WingetInstalled = $false
|
||||
}
|
||||
|
||||
@@ -208,7 +220,12 @@ if (-not $script:WingetInstalled -and -not $Silent) {
|
||||
# #
|
||||
##################################################################################################################
|
||||
|
||||
# Load app removal functions
|
||||
. "$PSScriptRoot/Scripts/AppRemoval/ForceRemoveEdge.ps1"
|
||||
. "$PSScriptRoot/Scripts/AppRemoval/RemoveApps.ps1"
|
||||
|
||||
# Load CLI functions
|
||||
. "$PSScriptRoot/Scripts/CLI/AwaitKeyToExit.ps1"
|
||||
. "$PSScriptRoot/Scripts/CLI/ShowCLILastUsedSettings.ps1"
|
||||
. "$PSScriptRoot/Scripts/CLI/ShowCLIDefaultModeAppRemovalOptions.ps1"
|
||||
. "$PSScriptRoot/Scripts/CLI/ShowCLIDefaultModeOptions.ps1"
|
||||
@@ -217,12 +234,21 @@ if (-not $script:WingetInstalled -and -not $Silent) {
|
||||
. "$PSScriptRoot/Scripts/CLI/PrintPendingChanges.ps1"
|
||||
. "$PSScriptRoot/Scripts/CLI/PrintHeader.ps1"
|
||||
|
||||
# Load Feature functions
|
||||
. "$PSScriptRoot/Scripts/Features/CreateSystemRestorePoint.ps1"
|
||||
. "$PSScriptRoot/Scripts/Features/DisableStoreSearchSuggestions.ps1"
|
||||
. "$PSScriptRoot/Scripts/Features/EnableWindowsFeature.ps1"
|
||||
. "$PSScriptRoot/Scripts/Features/ImportRegistryFile.ps1"
|
||||
. "$PSScriptRoot/Scripts/Features/ReplaceStartMenu.ps1"
|
||||
. "$PSScriptRoot/Scripts/Features/RestartExplorer.ps1"
|
||||
|
||||
# Load GUI functions
|
||||
. "$PSScriptRoot/Scripts/GUI/GetSystemUsesDarkMode.ps1"
|
||||
. "$PSScriptRoot/Scripts/GUI/SetWindowThemeResources.ps1"
|
||||
. "$PSScriptRoot/Scripts/GUI/AttachShiftClickBehavior.ps1"
|
||||
. "$PSScriptRoot/Scripts/GUI/ApplySettingsToUiControls.ps1"
|
||||
. "$PSScriptRoot/Scripts/GUI/Show-MessageBox.ps1"
|
||||
. "$PSScriptRoot/Scripts/GUI/Show-ApplyModal.ps1"
|
||||
. "$PSScriptRoot/Scripts/GUI/Show-AppSelectionWindow.ps1"
|
||||
. "$PSScriptRoot/Scripts/GUI/Show-MainWindow.ps1"
|
||||
. "$PSScriptRoot/Scripts/GUI/Show-AboutDialog.ps1"
|
||||
@@ -236,59 +262,59 @@ if (-not $script:WingetInstalled -and -not $Silent) {
|
||||
. "$PSScriptRoot/Scripts/FileIO/LoadAppsFromFile.ps1"
|
||||
. "$PSScriptRoot/Scripts/FileIO/LoadAppsDetailsFromJson.ps1"
|
||||
|
||||
# Writes to both GUI console output and standard console
|
||||
function Write-ToConsole {
|
||||
param(
|
||||
[string]$message,
|
||||
[string]$ForegroundColor = $null
|
||||
# Processes all pending WPF window messages (input, render, etc.) to keep the UI responsive
|
||||
# during long-running operations on the UI thread. Equivalent to Application.DoEvents().
|
||||
function DoEvents {
|
||||
if (-not $script:GuiWindow) { return }
|
||||
$frame = [System.Windows.Threading.DispatcherFrame]::new()
|
||||
[System.Windows.Threading.Dispatcher]::CurrentDispatcher.BeginInvoke(
|
||||
[System.Windows.Threading.DispatcherPriority]::Background,
|
||||
[System.Windows.Threading.DispatcherOperationCallback]{
|
||||
param($f)
|
||||
$f.Continue = $false
|
||||
return $null
|
||||
},
|
||||
$frame
|
||||
)
|
||||
|
||||
if ($script:GuiConsoleOutput) {
|
||||
# GUI mode
|
||||
$timestamp = Get-Date -Format "HH:mm:ss"
|
||||
$script:GuiConsoleOutput.Dispatcher.Invoke([System.Windows.Threading.DispatcherPriority]::Send, [action]{
|
||||
try {
|
||||
$runText = "[$timestamp] $message`n"
|
||||
$run = New-Object System.Windows.Documents.Run $runText
|
||||
[System.Windows.Threading.Dispatcher]::PushFrame($frame)
|
||||
}
|
||||
|
||||
if ($ForegroundColor) {
|
||||
try {
|
||||
$colorObj = [System.Windows.Media.ColorConverter]::ConvertFromString($ForegroundColor)
|
||||
if ($colorObj) {
|
||||
$brush = [System.Windows.Media.SolidColorBrush]::new($colorObj)
|
||||
$run.Foreground = $brush
|
||||
}
|
||||
}
|
||||
catch {
|
||||
# Invalid color string - ignore and fall back to default
|
||||
}
|
||||
}
|
||||
|
||||
$script:GuiConsoleOutput.Inlines.Add($run)
|
||||
if ($script:GuiConsoleScrollViewer) { $script:GuiConsoleScrollViewer.ScrollToEnd() }
|
||||
}
|
||||
catch {
|
||||
# If any UI update fails, fall back to simple text append
|
||||
try { $script:GuiConsoleOutput.Text += "[$timestamp] $message`n" } catch {}
|
||||
}
|
||||
})
|
||||
# Runs a scriptblock in a background PowerShell runspace while keeping the UI responsive.
|
||||
# In GUI mode, the work executes on a separate thread and the UI thread pumps messages (~60fps).
|
||||
# In CLI mode, the scriptblock runs directly in the current session.
|
||||
function Invoke-NonBlocking {
|
||||
param(
|
||||
[scriptblock]$ScriptBlock,
|
||||
[object[]]$ArgumentList = @()
|
||||
)
|
||||
|
||||
# Force UI to process pending updates for real-time display
|
||||
if ($script:GuiWindow) {
|
||||
$script:GuiWindow.Dispatcher.Invoke([System.Windows.Threading.DispatcherPriority]::Background, [action]{})
|
||||
}
|
||||
if (-not $script:GuiWindow) {
|
||||
return (& $ScriptBlock @ArgumentList)
|
||||
}
|
||||
|
||||
$ps = [powershell]::Create()
|
||||
try {
|
||||
if ($ForegroundColor) {
|
||||
Write-Host $message -ForegroundColor $ForegroundColor
|
||||
$null = $ps.AddScript($ScriptBlock.ToString())
|
||||
foreach ($arg in $ArgumentList) {
|
||||
$null = $ps.AddArgument($arg)
|
||||
}
|
||||
else {
|
||||
Write-Host $message
|
||||
|
||||
$handle = $ps.BeginInvoke()
|
||||
|
||||
while (-not $handle.IsCompleted) {
|
||||
DoEvents
|
||||
Start-Sleep -Milliseconds 16
|
||||
}
|
||||
|
||||
$result = $ps.EndInvoke($handle)
|
||||
|
||||
if ($result.Count -eq 0) { return $null }
|
||||
if ($result.Count -eq 1) { return $result[0] }
|
||||
return @($result)
|
||||
}
|
||||
catch {
|
||||
Write-Host $message
|
||||
finally {
|
||||
$ps.Dispose()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -470,304 +496,6 @@ function CheckModernStandbySupport {
|
||||
}
|
||||
|
||||
|
||||
# Removes apps specified during function call based on the target scope.
|
||||
function RemoveApps {
|
||||
param (
|
||||
$appslist
|
||||
)
|
||||
|
||||
# Determine target from script-level params, defaulting to AllUsers
|
||||
$targetUser = GetTargetUserForAppRemoval
|
||||
|
||||
Foreach ($app in $appsList) {
|
||||
if ($script:CancelRequested) {
|
||||
return
|
||||
}
|
||||
|
||||
Write-ToConsole "Attempting to remove $app..."
|
||||
|
||||
# Use WinGet only to remove OneDrive and Edge
|
||||
if (($app -eq "Microsoft.OneDrive") -or ($app -eq "Microsoft.Edge")) {
|
||||
if ($script:WingetInstalled -eq $false) {
|
||||
Write-ToConsole "WinGet is either not installed or is outdated, $app could not be removed" -ForegroundColor Red
|
||||
continue
|
||||
}
|
||||
|
||||
$appName = $app -replace '\.', '_'
|
||||
|
||||
# Uninstall app via WinGet, or create a scheduled task to uninstall it later
|
||||
if ($script:Params.ContainsKey("User")) {
|
||||
RegImport "Adding scheduled task to uninstall $app for user $(GetUserName)..." "Uninstall_$($appName).reg"
|
||||
}
|
||||
elseif ($script:Params.ContainsKey("Sysprep")) {
|
||||
RegImport "Adding scheduled task to uninstall $app after for new users..." "Uninstall_$($appName).reg"
|
||||
}
|
||||
else {
|
||||
# Uninstall app via WinGet
|
||||
winget uninstall --accept-source-agreements --disable-interactivity --id $app
|
||||
|
||||
If (($app -eq "Microsoft.Edge") -and (Select-String -InputObject $wingetOutput -Pattern "Uninstall failed with exit code")) {
|
||||
Write-ToConsole "Unable to uninstall Microsoft Edge via WinGet" -ForegroundColor Red
|
||||
|
||||
if ($script:GuiConsoleOutput) {
|
||||
$result = Show-MessageBox -Message 'Unable to uninstall Microsoft Edge via WinGet. Would you like to forcefully uninstall it? NOT RECOMMENDED!' -Title 'Force Uninstall Microsoft Edge?' -Button 'YesNo' -Icon 'Warning'
|
||||
|
||||
if ($result -eq 'Yes') {
|
||||
Write-ToConsole ""
|
||||
ForceRemoveEdge
|
||||
}
|
||||
}
|
||||
elseif ($( Read-Host -Prompt "Would you like to forcefully uninstall Microsoft Edge? NOT RECOMMENDED! (y/n)" ) -eq 'y') {
|
||||
Write-ToConsole ""
|
||||
ForceRemoveEdge
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
continue
|
||||
}
|
||||
|
||||
# Use Remove-AppxPackage to remove all other apps
|
||||
$appPattern = '*' + $app + '*'
|
||||
|
||||
try {
|
||||
switch ($targetUser) {
|
||||
"AllUsers" {
|
||||
# Remove installed app for all existing users
|
||||
Get-AppxPackage -Name $appPattern -AllUsers | Remove-AppxPackage -AllUsers -ErrorAction Continue
|
||||
|
||||
# Remove provisioned app from OS image, so the app won't be installed for any new users
|
||||
Get-AppxProvisionedPackage -Online | Where-Object { $_.PackageName -like $appPattern } | ForEach-Object { Remove-ProvisionedAppxPackage -Online -AllUsers -PackageName $_.PackageName }
|
||||
}
|
||||
"CurrentUser" {
|
||||
# Remove installed app for current user only
|
||||
Get-AppxPackage -Name $appPattern | Remove-AppxPackage -ErrorAction Continue
|
||||
}
|
||||
default {
|
||||
# Target is a specific username - remove app for that user only
|
||||
# Get the user's SID
|
||||
$userAccount = New-Object System.Security.Principal.NTAccount($targetUser)
|
||||
$userSid = $userAccount.Translate([System.Security.Principal.SecurityIdentifier]).Value
|
||||
|
||||
# Remove the app package for the specific user
|
||||
Get-AppxPackage -Name $appPattern -User $userSid | Remove-AppxPackage -User $userSid -ErrorAction Continue
|
||||
}
|
||||
}
|
||||
}
|
||||
catch {
|
||||
if ($DebugPreference -ne "SilentlyContinue") {
|
||||
Write-ToConsole "Something went wrong while trying to remove $app" -ForegroundColor Yellow
|
||||
Write-Host $psitem.Exception.StackTrace -ForegroundColor Gray
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Write-ToConsole ""
|
||||
}
|
||||
|
||||
|
||||
# Forcefully removes Microsoft Edge using its uninstaller
|
||||
# Credit: Based on work from loadstring1 & ave9858
|
||||
function ForceRemoveEdge {
|
||||
Write-ToConsole "> Forcefully uninstalling Microsoft Edge..."
|
||||
|
||||
$regView = [Microsoft.Win32.RegistryView]::Registry32
|
||||
$hklm = [Microsoft.Win32.RegistryKey]::OpenBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, $regView)
|
||||
$hklm.CreateSubKey('SOFTWARE\Microsoft\EdgeUpdateDev').SetValue('AllowUninstall', '')
|
||||
|
||||
# Create stub (This somehow allows uninstalling Edge)
|
||||
$edgeStub = "$env:SystemRoot\SystemApps\Microsoft.MicrosoftEdge_8wekyb3d8bbwe"
|
||||
New-Item $edgeStub -ItemType Directory | Out-Null
|
||||
New-Item "$edgeStub\MicrosoftEdge.exe" | Out-Null
|
||||
|
||||
# Remove edge
|
||||
$uninstallRegKey = $hklm.OpenSubKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft Edge')
|
||||
if ($null -ne $uninstallRegKey) {
|
||||
Write-ToConsole "Running uninstaller..."
|
||||
$uninstallString = $uninstallRegKey.GetValue('UninstallString') + ' --force-uninstall'
|
||||
Start-Process cmd.exe "/c $uninstallString" -WindowStyle Hidden -Wait
|
||||
|
||||
Write-ToConsole "Removing leftover files..."
|
||||
|
||||
$edgePaths = @(
|
||||
"$env:ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Edge.lnk",
|
||||
"$env:APPDATA\Microsoft\Internet Explorer\Quick Launch\Microsoft Edge.lnk",
|
||||
"$env:APPDATA\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\Microsoft Edge.lnk",
|
||||
"$env:APPDATA\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\Tombstones\Microsoft Edge.lnk",
|
||||
"$env:PUBLIC\Desktop\Microsoft Edge.lnk",
|
||||
"$env:USERPROFILE\Desktop\Microsoft Edge.lnk",
|
||||
"$edgeStub"
|
||||
)
|
||||
|
||||
foreach ($path in $edgePaths) {
|
||||
if (Test-Path -Path $path) {
|
||||
Remove-Item -Path $path -Force -Recurse -ErrorAction SilentlyContinue
|
||||
Write-ToConsole " Removed $path" -ForegroundColor DarkGray
|
||||
}
|
||||
}
|
||||
|
||||
Write-ToConsole "Cleaning up registry..."
|
||||
|
||||
# Remove MS Edge from autostart
|
||||
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run" /v "MicrosoftEdgeAutoLaunch_A9F6DCE4ABADF4F51CF45CD7129E3C6C" /f *>$null
|
||||
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run" /v "Microsoft Edge Update" /f *>$null
|
||||
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\StartupApproved\Run" /v "MicrosoftEdgeAutoLaunch_A9F6DCE4ABADF4F51CF45CD7129E3C6C" /f *>$null
|
||||
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\StartupApproved\Run" /v "Microsoft Edge Update" /f *>$null
|
||||
|
||||
Write-ToConsole "Microsoft Edge was uninstalled"
|
||||
}
|
||||
else {
|
||||
Write-ToConsole "Unable to forcefully uninstall Microsoft Edge, uninstaller could not be found" -ForegroundColor Red
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# Import & execute regfile
|
||||
function RegImport {
|
||||
param (
|
||||
$message,
|
||||
$path
|
||||
)
|
||||
|
||||
Write-ToConsole $message
|
||||
|
||||
# Validate that the regfile exists in both locations
|
||||
if (-not (Test-Path "$script:RegfilesPath\$path") -or -not (Test-Path "$script:RegfilesPath\Sysprep\$path")) {
|
||||
Write-ToConsole "Error: Unable to find registry file: $path" -ForegroundColor Red
|
||||
Write-ToConsole ""
|
||||
return
|
||||
}
|
||||
|
||||
# Reset exit code before running reg.exe for reliable success detection
|
||||
$global:LASTEXITCODE = 0
|
||||
|
||||
if ($script:Params.ContainsKey("Sysprep")) {
|
||||
$defaultUserPath = GetUserDirectory -userName "Default" -fileName "NTUSER.DAT"
|
||||
|
||||
reg load "HKU\Default" $defaultUserPath | Out-Null
|
||||
$regOutput = reg import "$script:RegfilesPath\Sysprep\$path" 2>&1
|
||||
reg unload "HKU\Default" | Out-Null
|
||||
}
|
||||
elseif ($script:Params.ContainsKey("User")) {
|
||||
$userPath = GetUserDirectory -userName $script:Params.Item("User") -fileName "NTUSER.DAT"
|
||||
|
||||
reg load "HKU\Default" $userPath | Out-Null
|
||||
$regOutput = reg import "$script:RegfilesPath\Sysprep\$path" 2>&1
|
||||
reg unload "HKU\Default" | Out-Null
|
||||
}
|
||||
else {
|
||||
$regOutput = reg import "$script:RegfilesPath\$path" 2>&1
|
||||
}
|
||||
|
||||
$hasSuccess = $LASTEXITCODE -eq 0
|
||||
|
||||
if ($regOutput) {
|
||||
foreach ($line in $regOutput) {
|
||||
$lineText = if ($line -is [System.Management.Automation.ErrorRecord]) { $line.Exception.Message } else { $line.ToString() }
|
||||
if ($lineText -and $lineText.Length -gt 0) {
|
||||
if ($hasSuccess) {
|
||||
Write-ToConsole $lineText
|
||||
}
|
||||
else {
|
||||
Write-ToConsole $lineText -ForegroundColor Red
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (-not $hasSuccess) {
|
||||
Write-ToConsole "Failed importing registry file: $path" -ForegroundColor Red
|
||||
}
|
||||
|
||||
Write-ToConsole ""
|
||||
}
|
||||
|
||||
|
||||
# Replace the startmenu for all users, when using the default startmenuTemplate this clears all pinned apps
|
||||
# Credit: https://lazyadmin.nl/win-11/customize-windows-11-start-menu-layout/
|
||||
function ReplaceStartMenuForAllUsers {
|
||||
param (
|
||||
$startMenuTemplate = "$script:AssetsPath/Start/start2.bin"
|
||||
)
|
||||
|
||||
Write-ToConsole "> Removing all pinned apps from the start menu for all users..."
|
||||
|
||||
# Check if template bin file exists
|
||||
if (-not (Test-Path $startMenuTemplate)) {
|
||||
Write-ToConsole "Error: Unable to clear start menu, start2.bin file missing from script folder" -ForegroundColor Red
|
||||
Write-ToConsole ""
|
||||
return
|
||||
}
|
||||
|
||||
# Get path to start menu file for all users
|
||||
$userPathString = GetUserDirectory -userName "*" -fileName "AppData\Local\Packages\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\LocalState"
|
||||
$usersStartMenuPaths = get-childitem -path $userPathString
|
||||
|
||||
# Go through all users and replace the start menu file
|
||||
ForEach ($startMenuPath in $usersStartMenuPaths) {
|
||||
ReplaceStartMenu $startMenuTemplate "$($startMenuPath.Fullname)\start2.bin"
|
||||
}
|
||||
|
||||
# Also replace the start menu file for the default user profile
|
||||
$defaultStartMenuPath = GetUserDirectory -userName "Default" -fileName "AppData\Local\Packages\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\LocalState" -exitIfPathNotFound $false
|
||||
|
||||
# Create folder if it doesn't exist
|
||||
if (-not (Test-Path $defaultStartMenuPath)) {
|
||||
new-item $defaultStartMenuPath -ItemType Directory -Force | Out-Null
|
||||
Write-ToConsole "Created LocalState folder for default user profile"
|
||||
}
|
||||
|
||||
# Copy template to default profile
|
||||
Copy-Item -Path $startMenuTemplate -Destination $defaultStartMenuPath -Force
|
||||
Write-ToConsole "Replaced start menu for the default user profile"
|
||||
Write-ToConsole ""
|
||||
}
|
||||
|
||||
|
||||
# Replace the startmenu for all users, when using the default startmenuTemplate this clears all pinned apps
|
||||
# Credit: https://lazyadmin.nl/win-11/customize-windows-11-start-menu-layout/
|
||||
function ReplaceStartMenu {
|
||||
param (
|
||||
$startMenuTemplate = "$script:AssetsPath/Start/start2.bin",
|
||||
$startMenuBinFile = "$env:LOCALAPPDATA\Packages\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\LocalState\start2.bin"
|
||||
)
|
||||
|
||||
# Change path to correct user if a user was specified
|
||||
if ($script:Params.ContainsKey("User")) {
|
||||
$startMenuBinFile = GetUserDirectory -userName "$(GetUserName)" -fileName "AppData\Local\Packages\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\LocalState\start2.bin" -exitIfPathNotFound $false
|
||||
}
|
||||
|
||||
# Check if template bin file exists
|
||||
if (-not (Test-Path $startMenuTemplate)) {
|
||||
Write-ToConsole "Error: Unable to replace start menu, template file not found" -ForegroundColor Red
|
||||
return
|
||||
}
|
||||
|
||||
if ([IO.Path]::GetExtension($startMenuTemplate) -ne ".bin" ) {
|
||||
Write-ToConsole "Error: Unable to replace start menu, template file is not a valid .bin file" -ForegroundColor Red
|
||||
return
|
||||
}
|
||||
|
||||
$userName = [regex]::Match($startMenuBinFile, '(?:Users\\)([^\\]+)(?:\\AppData)').Groups[1].Value
|
||||
|
||||
$backupBinFile = $startMenuBinFile + ".bak"
|
||||
|
||||
if (Test-Path $startMenuBinFile) {
|
||||
# Backup current start menu file
|
||||
Move-Item -Path $startMenuBinFile -Destination $backupBinFile -Force
|
||||
}
|
||||
else {
|
||||
Write-ToConsole "Unable to find original start2.bin file for user $userName, no backup was created for this user" -ForegroundColor Yellow
|
||||
New-Item -ItemType File -Path $startMenuBinFile -Force
|
||||
}
|
||||
|
||||
# Copy template file
|
||||
Copy-Item -Path $startMenuTemplate -Destination $startMenuBinFile -Force
|
||||
|
||||
Write-ToConsole "Replaced start menu for user $userName"
|
||||
}
|
||||
|
||||
|
||||
# Generates a list of apps to remove based on the Apps parameter
|
||||
function GenerateAppsList {
|
||||
if (-not ($script:Params["Apps"] -and $script:Params["Apps"] -is [string])) {
|
||||
@@ -803,11 +531,11 @@ function ExecuteParameter {
|
||||
$feature = $script:Features[$paramKey]
|
||||
}
|
||||
|
||||
# If feature has RegistryKey and ApplyText, use dynamic RegImport
|
||||
# If feature has RegistryKey and ApplyText, use dynamic ImportRegistryFile
|
||||
if ($feature -and $feature.RegistryKey -and $feature.ApplyText) {
|
||||
RegImport $feature.ApplyText $feature.RegistryKey
|
||||
ImportRegistryFile "> $($feature.ApplyText)" $feature.RegistryKey
|
||||
|
||||
# Handle special cases that have additional logic after RegImport
|
||||
# Handle special cases that have additional logic after ImportRegistryFile
|
||||
switch ($paramKey) {
|
||||
'DisableBing' {
|
||||
# Also remove the app package for Bing search
|
||||
@@ -828,69 +556,78 @@ function ExecuteParameter {
|
||||
# Handle features without RegistryKey or with special logic
|
||||
switch ($paramKey) {
|
||||
'RemoveApps' {
|
||||
Write-ToConsole "> Removing selected apps for $(GetFriendlyTargetUserName)..."
|
||||
Write-Host "> Removing selected apps for $(GetFriendlyTargetUserName)..."
|
||||
$appsList = GenerateAppsList
|
||||
|
||||
if ($appsList.Count -eq 0) {
|
||||
Write-ToConsole "No valid apps were selected for removal" -ForegroundColor Yellow
|
||||
Write-ToConsole ""
|
||||
Write-Host "No valid apps were selected for removal" -ForegroundColor Yellow
|
||||
Write-Host ""
|
||||
return
|
||||
}
|
||||
|
||||
Write-ToConsole "$($appsList.Count) apps selected for removal"
|
||||
Write-Host "$($appsList.Count) apps selected for removal"
|
||||
RemoveApps $appsList
|
||||
}
|
||||
'RemoveAppsCustom' {
|
||||
Write-ToConsole "> Removing selected apps..."
|
||||
Write-Host "> Removing selected apps..."
|
||||
$appsList = LoadAppsFromFile $script:CustomAppsListFilePath
|
||||
|
||||
if ($appsList.Count -eq 0) {
|
||||
Write-ToConsole "No valid apps were selected for removal" -ForegroundColor Yellow
|
||||
Write-ToConsole ""
|
||||
Write-Host "No valid apps were selected for removal" -ForegroundColor Yellow
|
||||
Write-Host ""
|
||||
return
|
||||
}
|
||||
|
||||
Write-ToConsole "$($appsList.Count) apps selected for removal"
|
||||
Write-Host "$($appsList.Count) apps selected for removal"
|
||||
RemoveApps $appsList
|
||||
}
|
||||
'RemoveCommApps' {
|
||||
$appsList = 'Microsoft.windowscommunicationsapps', 'Microsoft.People'
|
||||
Write-ToConsole "> Removing Mail, Calendar and People apps..."
|
||||
Write-Host "> Removing Mail, Calendar and People apps..."
|
||||
RemoveApps $appsList
|
||||
return
|
||||
}
|
||||
'RemoveW11Outlook' {
|
||||
$appsList = 'Microsoft.OutlookForWindows'
|
||||
Write-ToConsole "> Removing new Outlook for Windows app..."
|
||||
Write-Host "> Removing new Outlook for Windows app..."
|
||||
RemoveApps $appsList
|
||||
return
|
||||
}
|
||||
'RemoveGamingApps' {
|
||||
$appsList = 'Microsoft.GamingApp', 'Microsoft.XboxGameOverlay', 'Microsoft.XboxGamingOverlay'
|
||||
Write-ToConsole "> Removing gaming related apps..."
|
||||
Write-Host "> Removing gaming related apps..."
|
||||
RemoveApps $appsList
|
||||
return
|
||||
}
|
||||
'RemoveHPApps' {
|
||||
$appsList = 'AD2F1837.HPAIExperienceCenter', 'AD2F1837.HPJumpStarts', 'AD2F1837.HPPCHardwareDiagnosticsWindows', 'AD2F1837.HPPowerManager', 'AD2F1837.HPPrivacySettings', 'AD2F1837.HPSupportAssistant', 'AD2F1837.HPSureShieldAI', 'AD2F1837.HPSystemInformation', 'AD2F1837.HPQuickDrop', 'AD2F1837.HPWorkWell', 'AD2F1837.myHP', 'AD2F1837.HPDesktopSupportUtilities', 'AD2F1837.HPQuickTouch', 'AD2F1837.HPEasyClean', 'AD2F1837.HPConnectedMusic', 'AD2F1837.HPFileViewer', 'AD2F1837.HPRegistration', 'AD2F1837.HPWelcome', 'AD2F1837.HPConnectedPhotopoweredbySnapfish', 'AD2F1837.HPPrinterControl'
|
||||
Write-ToConsole "> Removing HP apps..."
|
||||
Write-Host "> Removing HP apps..."
|
||||
RemoveApps $appsList
|
||||
return
|
||||
}
|
||||
"ForceRemoveEdge" {
|
||||
ForceRemoveEdge
|
||||
"EnableWindowsSandbox" {
|
||||
Write-Host "> Enabling Windows Sandbox..."
|
||||
EnableWindowsFeature "Containers-DisposableClientVM"
|
||||
Write-Host ""
|
||||
return
|
||||
}
|
||||
"EnableWindowsSubsystemForLinux" {
|
||||
Write-Host "> Enabling Windows Subsystem for Linux..."
|
||||
EnableWindowsFeature "VirtualMachinePlatform"
|
||||
EnableWindowsFeature "Microsoft-Windows-Subsystem-Linux"
|
||||
Write-Host ""
|
||||
return
|
||||
}
|
||||
'ClearStart' {
|
||||
Write-ToConsole "> Removing all pinned apps from the start menu for user $(GetUserName)..."
|
||||
Write-Host "> Removing all pinned apps from the start menu for user $(GetUserName)..."
|
||||
ReplaceStartMenu
|
||||
Write-ToConsole ""
|
||||
Write-Host ""
|
||||
return
|
||||
}
|
||||
'ReplaceStart' {
|
||||
Write-ToConsole "> Replacing the start menu for user $(GetUserName)..."
|
||||
Write-Host "> Replacing the start menu for user $(GetUserName)..."
|
||||
ReplaceStartMenu $script:Params.Item("ReplaceStart")
|
||||
Write-ToConsole ""
|
||||
Write-Host ""
|
||||
return
|
||||
}
|
||||
'ClearStartAllUsers' {
|
||||
@@ -901,6 +638,19 @@ function ExecuteParameter {
|
||||
ReplaceStartMenuForAllUsers $script:Params.Item("ReplaceStartAllUsers")
|
||||
return
|
||||
}
|
||||
'DisableStoreSearchSuggestions' {
|
||||
if ($script:Params.ContainsKey("Sysprep")) {
|
||||
Write-Host "> Disabling Microsoft Store search suggestions in the start menu for all users..."
|
||||
DisableStoreSearchSuggestionsForAllUsers
|
||||
Write-Host ""
|
||||
return
|
||||
}
|
||||
|
||||
Write-Host "> Disabling Microsoft Store search suggestions for user $(GetUserName)..."
|
||||
DisableStoreSearchSuggestions
|
||||
Write-Host ""
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -908,21 +658,57 @@ function ExecuteParameter {
|
||||
# Executes all selected parameters/features
|
||||
# Parameters:
|
||||
function ExecuteAllChanges {
|
||||
# Build list of actionable parameters (skip control params and data-only params)
|
||||
$actionableKeys = @()
|
||||
foreach ($paramKey in $script:Params.Keys) {
|
||||
if ($script:ControlParams -contains $paramKey) { continue }
|
||||
if ($paramKey -eq 'Apps') { continue }
|
||||
if ($paramKey -eq 'CreateRestorePoint') { continue }
|
||||
$actionableKeys += $paramKey
|
||||
}
|
||||
|
||||
$totalSteps = $actionableKeys.Count
|
||||
if ($script:Params.ContainsKey("CreateRestorePoint")) { $totalSteps++ }
|
||||
$currentStep = 0
|
||||
|
||||
# Create restore point if requested (CLI only - GUI handles this separately)
|
||||
if ($script:Params.ContainsKey("CreateRestorePoint")) {
|
||||
Write-ToConsole "> Attempting to create a system restore point..."
|
||||
$currentStep++
|
||||
if ($script:ApplyProgressCallback) {
|
||||
& $script:ApplyProgressCallback $currentStep $totalSteps "Creating system restore point"
|
||||
}
|
||||
Write-Host "> Attempting to create a system restore point..."
|
||||
CreateSystemRestorePoint
|
||||
Write-ToConsole ""
|
||||
Write-Host ""
|
||||
}
|
||||
|
||||
# Execute all parameters
|
||||
foreach ($paramKey in $script:Params.Keys) {
|
||||
foreach ($paramKey in $actionableKeys) {
|
||||
if ($script:CancelRequested) {
|
||||
return
|
||||
}
|
||||
|
||||
if ($script:ControlParams -contains $paramKey) {
|
||||
continue
|
||||
$currentStep++
|
||||
|
||||
# Get friendly name for the step
|
||||
$stepName = $paramKey
|
||||
if ($script:Features.ContainsKey($paramKey)) {
|
||||
$feature = $script:Features[$paramKey]
|
||||
if ($feature.ApplyText) {
|
||||
# Prefer explicit ApplyText when provided
|
||||
$stepName = $feature.ApplyText
|
||||
} elseif ($feature.Label) {
|
||||
# Fallback: construct a name from Action and Label, or just Label
|
||||
if ($feature.Action) {
|
||||
$stepName = "$($feature.Action) $($feature.Label)"
|
||||
} else {
|
||||
$stepName = $feature.Label
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($script:ApplyProgressCallback) {
|
||||
& $script:ApplyProgressCallback $currentStep $totalSteps $stepName
|
||||
}
|
||||
|
||||
ExecuteParameter -paramKey $paramKey
|
||||
@@ -930,158 +716,6 @@ function ExecuteAllChanges {
|
||||
}
|
||||
|
||||
|
||||
function CreateSystemRestorePoint {
|
||||
$SysRestore = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore" -Name "RPSessionInterval"
|
||||
$failed = $false
|
||||
|
||||
if ($SysRestore.RPSessionInterval -eq 0) {
|
||||
# In GUI mode, skip the prompt and just try to enable it
|
||||
if ($script:GuiConsoleOutput -or $Silent -or $( Read-Host -Prompt "System restore is disabled, would you like to enable it and create a restore point? (y/n)") -eq 'y') {
|
||||
$enableSystemRestoreJob = Start-Job {
|
||||
try {
|
||||
Enable-ComputerRestore -Drive "$env:SystemDrive"
|
||||
}
|
||||
catch {
|
||||
return "Error: Failed to enable System Restore: $_"
|
||||
}
|
||||
return $null
|
||||
}
|
||||
|
||||
$enableSystemRestoreJobDone = $enableSystemRestoreJob | Wait-Job -TimeOut 20
|
||||
|
||||
if (-not $enableSystemRestoreJobDone) {
|
||||
Remove-Job -Job $enableSystemRestoreJob -Force -ErrorAction SilentlyContinue
|
||||
Write-ToConsole "Error: Failed to enable system restore and create restore point, operation timed out" -ForegroundColor Red
|
||||
$failed = $true
|
||||
}
|
||||
else {
|
||||
$result = Receive-Job $enableSystemRestoreJob
|
||||
Remove-Job -Job $enableSystemRestoreJob -ErrorAction SilentlyContinue
|
||||
if ($result) {
|
||||
Write-ToConsole $result -ForegroundColor Red
|
||||
$failed = $true
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
Write-ToConsole ""
|
||||
$failed = $true
|
||||
}
|
||||
}
|
||||
|
||||
if (-not $failed) {
|
||||
$createRestorePointJob = Start-Job {
|
||||
# Find existing restore points that are less than 24 hours old
|
||||
try {
|
||||
$recentRestorePoints = Get-ComputerRestorePoint | Where-Object { (Get-Date) - [System.Management.ManagementDateTimeConverter]::ToDateTime($_.CreationTime) -le (New-TimeSpan -Hours 24) }
|
||||
}
|
||||
catch {
|
||||
return @{ Success = $false; Message = "Error: Unable to retrieve existing restore points: $_" }
|
||||
}
|
||||
|
||||
if ($recentRestorePoints.Count -eq 0) {
|
||||
try {
|
||||
Checkpoint-Computer -Description "Restore point created by Win11Debloat" -RestorePointType "MODIFY_SETTINGS"
|
||||
return @{ Success = $true; Message = "System restore point created successfully" }
|
||||
}
|
||||
catch {
|
||||
return @{ Success = $false; Message = "Error: Unable to create restore point: $_" }
|
||||
}
|
||||
}
|
||||
else {
|
||||
return @{ Success = $true; Message = "A recent restore point already exists, no new restore point was created" }
|
||||
}
|
||||
}
|
||||
|
||||
$createRestorePointJobDone = $createRestorePointJob | Wait-Job -TimeOut 20
|
||||
|
||||
if (-not $createRestorePointJobDone) {
|
||||
Remove-Job -Job $createRestorePointJob -Force -ErrorAction SilentlyContinue
|
||||
Write-ToConsole "Error: Failed to create system restore point, operation timed out" -ForegroundColor Red
|
||||
$failed = $true
|
||||
}
|
||||
else {
|
||||
$result = Receive-Job $createRestorePointJob
|
||||
Remove-Job -Job $createRestorePointJob -ErrorAction SilentlyContinue
|
||||
if ($result.Success) {
|
||||
Write-ToConsole $result.Message
|
||||
}
|
||||
else {
|
||||
Write-ToConsole $result.Message -ForegroundColor Red
|
||||
$failed = $true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Ensure that the user is aware if creating a restore point failed, and give them the option to continue without a restore point or cancel the script
|
||||
if ($failed) {
|
||||
if ($script:GuiConsoleOutput) {
|
||||
$result = Show-MessageBox "Failed to create a system restore point. Do you want to continue without a restore point?" "Restore Point Creation Failed" "YesNo" "Warning"
|
||||
|
||||
if ($result -ne "Yes") {
|
||||
$script:CancelRequested = $true
|
||||
return
|
||||
}
|
||||
}
|
||||
elseif (-not $Silent) {
|
||||
Write-ToConsole "Failed to create a system restore point. Do you want to continue without a restore point? (y/n)" -ForegroundColor Yellow
|
||||
if ($( Read-Host ) -ne 'y') {
|
||||
$script:CancelRequested = $true
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
Write-ToConsole "Warning: Continuing without restore point" -ForegroundColor Yellow
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# Restart the Windows Explorer process
|
||||
function RestartExplorer {
|
||||
Write-ToConsole "> Attempting to restart the Windows Explorer process to apply all changes..."
|
||||
|
||||
if ($script:Params.ContainsKey("Sysprep") -or $script:Params.ContainsKey("User") -or $script:Params.ContainsKey("NoRestartExplorer")) {
|
||||
Write-ToConsole "Explorer process restart was skipped, please manually reboot your PC to apply all changes" -ForegroundColor Yellow
|
||||
return
|
||||
}
|
||||
|
||||
if ($script:Params.ContainsKey("DisableMouseAcceleration")) {
|
||||
Write-ToConsole "Warning: Changes to the Enhance Pointer Precision setting will only take effect after a reboot" -ForegroundColor Yellow
|
||||
}
|
||||
|
||||
if ($script:Params.ContainsKey("DisableStickyKeys")) {
|
||||
Write-ToConsole "Warning: Changes to the Sticky Keys setting will only take effect after a reboot" -ForegroundColor Yellow
|
||||
}
|
||||
|
||||
if ($script:Params.ContainsKey("DisableAnimations")) {
|
||||
Write-ToConsole "Warning: Animations will only be disabled after a reboot" -ForegroundColor Yellow
|
||||
}
|
||||
|
||||
# Only restart if the powershell process matches the OS architecture.
|
||||
# Restarting explorer from a 32bit PowerShell window will fail on a 64bit OS
|
||||
if ([Environment]::Is64BitProcess -eq [Environment]::Is64BitOperatingSystem) {
|
||||
Write-ToConsole "Restarting the Windows Explorer process... (This may cause your screen to flicker)"
|
||||
Stop-Process -processName: Explorer -Force
|
||||
}
|
||||
else {
|
||||
Write-ToConsole "Unable to restart Windows Explorer process, please manually reboot your PC to apply all changes" -ForegroundColor Yellow
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function AwaitKeyToExit {
|
||||
# Suppress prompt if Silent parameter was passed
|
||||
if (-not $Silent) {
|
||||
Write-Output ""
|
||||
Write-Output "Press any key to exit..."
|
||||
$null = [System.Console]::ReadKey()
|
||||
}
|
||||
|
||||
Stop-Transcript
|
||||
Exit
|
||||
}
|
||||
|
||||
|
||||
|
||||
##################################################################################################################
|
||||
# #
|
||||
|
||||
Reference in New Issue
Block a user