Skip to content

Commit 8dc2f7b

Browse files
committed
Add customization of Windows 11 Start menu
1 parent 6baa658 commit 8dc2f7b

File tree

5 files changed

+64
-23
lines changed

5 files changed

+64
-23
lines changed

Main.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,8 @@ public record class Configuration(
312312
HideModes HideFiles,
313313
bool HideEdgeFre,
314314
bool MakeEdgeUninstallable,
315-
TaskbarSearchMode TaskbarSearch
315+
TaskbarSearchMode TaskbarSearch,
316+
IStartPinsSettings StartPinsSetting
316317
)
317318
{
318319
public static Configuration Default => new(
@@ -363,7 +364,8 @@ TaskbarSearchMode TaskbarSearch
363364
HideFiles: HideModes.Hidden,
364365
HideEdgeFre: false,
365366
MakeEdgeUninstallable: false,
366-
TaskbarSearch: TaskbarSearchMode.Box
367+
TaskbarSearch: TaskbarSearchMode.Box,
368+
StartPinsSetting: new DefaultStartPinsSettings()
367369
);
368370
}
369371

UnattendGenerator.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
<None Remove="resource\RemoveCapabilities.ps1" />
1717
<None Remove="resource\RemoveFeatures.ps1" />
1818
<None Remove="resource\RemovePackages.ps1" />
19+
<None Remove="resource\SetStartPins.ps1" />
1920
<None Remove="resource\SetWallpaper.ps1" />
2021
<None Remove="resource\ShowAllTrayIcons.ps1" />
2122
<None Remove="resource\ShowAllTrayIcons.vbs" />
@@ -36,6 +37,7 @@
3637
<EmbeddedResource Include="resource\DeleteTaskbarIcons.ps1" />
3738
<EmbeddedResource Include="resource\MakeEdgeUninstallable.ps1" />
3839
<EmbeddedResource Include="resource\SetWallpaper.ps1" />
40+
<EmbeddedResource Include="resource\SetStartPins.ps1" />
3941
<EmbeddedResource Include="resource\ShowAllTrayIcons.vbs" />
4042
<EmbeddedResource Include="resource\ShowAllTrayIcons.ps1" />
4143
<EmbeddedResource Include="resource\RemoveBloatware.ps1" />

modifier/Bloatware.cs

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -231,26 +231,6 @@ public override void Process()
231231
""");
232232
AddXmlFile(xml, @"C:\Users\Default\AppData\Local\Microsoft\Windows\Shell\LayoutModification.xml");
233233
}
234-
{
235-
// Windows 11
236-
string json = @"""{ \""pinnedList\"": [] }""";
237-
string guid = "B5292708-1619-419B-9923-E5D9F3925E71";
238-
{
239-
string key = @"HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Start";
240-
appender.Append([
241-
CommandBuilder.RegistryCommand($@"add ""{key}"" /v ConfigureStartPins /t REG_SZ /d {json} /f"),
242-
CommandBuilder.RegistryCommand($@"add ""{key}"" /v ConfigureStartPins_ProviderSet /t REG_DWORD /d 1 /f"),
243-
CommandBuilder.RegistryCommand($@"add ""{key}"" /v ConfigureStartPins_WinningProvider /t REG_SZ /d {guid} /f"),
244-
]);
245-
}
246-
{
247-
string key = $@"HKLM\SOFTWARE\Microsoft\PolicyManager\providers\{guid}\default\Device\Start";
248-
appender.Append([
249-
CommandBuilder.RegistryCommand($@"add ""{key}"" /v ConfigureStartPins /t REG_SZ /d {json} /f"),
250-
CommandBuilder.RegistryCommand($@"add ""{key}"" /v ConfigureStartPins_LastWrite /t REG_DWORD /d 1 /f"),
251-
]);
252-
}
253-
}
254234
}
255235
}
256236
}

modifier/Optimizations.cs

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System;
1+
using Newtonsoft.Json;
2+
using System;
23
using System.Collections.Generic;
34
using System.Drawing;
45
using System.IO;
@@ -52,6 +53,16 @@ public record class SolidWallpaperSettings(
5253
Color Color
5354
) : IWallpaperSettings;
5455

56+
public interface IStartPinsSettings;
57+
58+
public class DefaultStartPinsSettings : IStartPinsSettings;
59+
60+
public class EmptyStartPinsSettings : IStartPinsSettings;
61+
62+
public record class CustomStartPinsSettings(
63+
string Json
64+
) : IStartPinsSettings;
65+
5566
class OptimizationsModifier(ModifierContext context) : Modifier(context)
5667
{
5768
public override void Process()
@@ -465,5 +476,45 @@ IEnumerable<string> SetExplorerOptions(string rootKey, string subKey)
465476
})
466477
);
467478
}
479+
{
480+
void SetStartPins(string json)
481+
{
482+
string ps1File = @"C:\Windows\Setup\Scripts\SetStartPins.ps1";
483+
string script = Util.StringFromResource("SetStartPins.ps1");
484+
StringWriter writer = new();
485+
writer.WriteLine($"$json = '{json.Replace("'", "''")}';");
486+
writer.WriteLine(script);
487+
AddTextFile(writer.ToString(), ps1File);
488+
appender.Append(
489+
CommandBuilder.InvokePowerShellScript(ps1File)
490+
);
491+
}
492+
493+
switch (Configuration.StartPinsSetting)
494+
{
495+
case DefaultStartPinsSettings:
496+
break;
497+
498+
case EmptyStartPinsSettings:
499+
SetStartPins(@"{""pinnedList"":[]}");
500+
break;
501+
502+
case CustomStartPinsSettings settings:
503+
try
504+
{
505+
using JsonTextReader reader = new(new StringReader(settings.Json));
506+
while (reader.Read()) { }
507+
}
508+
catch
509+
{
510+
throw new ConfigurationException($"The string '{settings.Json}' is not valid JSON.");
511+
}
512+
SetStartPins(settings.Json.Trim());
513+
break;
514+
515+
default:
516+
throw new NotSupportedException();
517+
}
518+
}
468519
}
469520
}

resource/SetStartPins.ps1

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
if( [System.Environment]::OSVersion.Version.Build -lt 20000 ) {
2+
return;
3+
}
4+
$key = 'Registry::HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Start';
5+
New-Item -Path $key -ItemType 'Directory' -ErrorAction 'SilentlyContinue';
6+
Set-ItemProperty -LiteralPath $key -Name 'ConfigureStartPins' -Value $json -Type 'String';

0 commit comments

Comments
 (0)