public void LinkToFonts(RegistryKey fontLinkKey, FixedFontList toBeLinkedFonts) { for (var i = 0; i < Count; i++) { var baseFont = _linkedFonts[i]; for (var j = 0; j < toBeLinkedFonts.Count; j++) { var toBeLinkedFont = toBeLinkedFonts._linkedFonts[j]; LinkFonts(fontLinkKey, ref baseFont, ref toBeLinkedFont); } } }
private static void LinkFonts(RegistryKey fontLinkKey, ref FixedFont baseFont, ref FixedFont toBeLinkedFont) { FixedFontList existingLinkedFonts; RegistryValueKind kind = 0; bool toAdd; // Determine if the font is a base font. var names = fontLinkKey.GetValueNames(); var valueName = baseFont.Name; if (Array.Exists(names, s => s.Equals(valueName, StringComparison.OrdinalIgnoreCase))) { // Get the value's type. kind = fontLinkKey.GetValueKind(valueName); // Type should be RegistryValueKind.MultiString, but we can't be sure. switch (kind) { case RegistryValueKind.String: existingLinkedFonts = new FixedFontList((string)fontLinkKey.GetValue(valueName)); break; case RegistryValueKind.MultiString: existingLinkedFonts = new FixedFontList((string[])fontLinkKey.GetValue(valueName)); break; default: // Do nothing. existingLinkedFonts = new FixedFontList(); break; } if (existingLinkedFonts.Contains(toBeLinkedFont)) { Console.Error.WriteLine("{1} is already linked to {0}", baseFont, toBeLinkedFont); toAdd = false; } else { // Font is not a linked font. toAdd = true; } } else { // Font is not a base font. toAdd = true; existingLinkedFonts = new FixedFontList(); } if (toAdd) { existingLinkedFonts.Add(toBeLinkedFont); // Change REG_SZ to REG_MULTI_SZ. if (kind == RegistryValueKind.String) { fontLinkKey.DeleteValue(valueName, false); } fontLinkKey.SetValue(valueName, existingLinkedFonts.ToRegArray(), RegistryValueKind.MultiString); Console.WriteLine("Linked {1} to {0}", baseFont, toBeLinkedFont); } }