diff --git a/ZuneModCore/Mods/BackgroundImageMod.cs b/ZuneModCore/Mods/BackgroundImageMod.cs index 9510ba4..bc5d929 100644 --- a/ZuneModCore/Mods/BackgroundImageMod.cs +++ b/ZuneModCore/Mods/BackgroundImageMod.cs @@ -17,11 +17,13 @@ public class BackgroundImageModFactory : DIModFactoryBase private const string Author = "Joshua \"Yoshi\" Askharoun"; public override ModMetadata Metadata => new(nameof(BackgroundImageMod), "Background Image", - Description, Author, new(1, 0)); + Description, Author, new(1, 1)); } public class BackgroundImageMod(ModMetadata metadata, IModCoreConfig modConfig) : Mod(metadata) { + private const string FRAMEBACKGROUND_NAME = "FRAMEBACKGROUND06.PNG"; + public string ZuneInstallDir => modConfig.ZuneInstallDir; public override AbstractUICollection? GetDefaultOptionsUI() @@ -90,7 +92,7 @@ public class BackgroundImageMod(ModMetadata metadata, IModCoreConfig modConfig) // Locate the image resource // TODO: Allow users to specify which background they want to replace List RCDATA = vi.Resources[resId]; - int idx = RCDATA.FindIndex(r => r.Name.Name == "FRAMEBACKGROUND06.PNG"); + int idx = RCDATA.FindIndex(r => r.Name.Name == FRAMEBACKGROUND_NAME); if (idx < 0) return $"Failed to locate background image resource in Zune software."; GenericResource ogRes = (GenericResource)RCDATA[idx]; @@ -105,6 +107,10 @@ public class BackgroundImageMod(ModMetadata metadata, IModCoreConfig modConfig) } File.Copy(zsrDllTempPath, zsrDllInfo.FullName, true); + // Configure Zune to use the "Zero" background + var resourceUri = $"res://ZuneShellResources.dll!{FRAMEBACKGROUND_NAME}"; + RegEdit.CurrentUserSetStringValue(RegEdit.ZUNE_REG_PATH + "Shell", "BackgroundImage", resourceUri); + return null; } catch (IOException) diff --git a/ZuneModCore/Win32/RegEdit.cs b/ZuneModCore/Win32/RegEdit.cs index 4ae1c2a..09a733e 100644 --- a/ZuneModCore/Win32/RegEdit.cs +++ b/ZuneModCore/Win32/RegEdit.cs @@ -6,6 +6,31 @@ public class RegEdit { public const string ZUNE_REG_PATH = @"SOFTWARE\Microsoft\Zune\"; + public static bool CurrentUserSetStringValue(string key, string name, string value) + { + RegistryKey? regKey = Registry.CurrentUser.OpenSubKey(key, true); + regKey ??= Registry.CurrentUser.CreateSubKey(key, true); + + regKey.SetValue(name, value, RegistryValueKind.String); + regKey.Close(); + regKey.Dispose(); + + // Read the key to make sure it was set properly + return CurrentUserGetStringValue(key, name) == value; + } + + public static string? CurrentUserGetStringValue(string key, string name) + { + using RegistryKey? regKey = Registry.CurrentUser.OpenSubKey(key, true); + if (regKey == null) + return null; + + // Return null if a string value couldn't be read from the key + if (regKey.GetValue(name, false) is string value) + return value; + return null; + } + public static bool CurrentUserSetBoolValue(string key, string name, bool value) { RegistryKey? regKey = Registry.CurrentUser.OpenSubKey(key, true); @@ -16,9 +41,7 @@ public class RegEdit regKey.Dispose(); // Read the key to make sure it was set properly - if (CurrentUserGetBoolValue(key, name) == null) - return false; - return true; + return CurrentUserGetBoolValue(key, name) == value; } public static bool? CurrentUserGetBoolValue(string key, string name)