85 lines
3.6 KiB
C#
85 lines
3.6 KiB
C#
using System.Windows;
|
|
using System.Windows.Media;
|
|
using Microsoft.Win32;
|
|
using MediaColor = System.Windows.Media.Color;
|
|
|
|
namespace TaskbarLauncher.Services;
|
|
|
|
public static class ThemeService
|
|
{
|
|
private const string PersonalizeKey = @"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize";
|
|
private const string DwmKey = @"Software\Microsoft\Windows\DWM";
|
|
|
|
public static void Apply()
|
|
{
|
|
bool isLight = IsLightTheme();
|
|
MediaColor accent = GetAccentColor();
|
|
MediaColor window = isLight ? MediaColor.FromRgb(0xF7, 0xF7, 0xF7) : MediaColor.FromRgb(0x20, 0x20, 0x20);
|
|
MediaColor surface = isLight ? System.Windows.Media.Colors.White : MediaColor.FromRgb(0x2B, 0x2B, 0x2B);
|
|
MediaColor control = isLight ? MediaColor.FromRgb(0xF3, 0xF3, 0xF3) : MediaColor.FromRgb(0x33, 0x33, 0x33);
|
|
MediaColor hover = isLight ? MediaColor.FromRgb(0xEA, 0xF3, 0xFF) : MediaColor.FromRgb(0x3B, 0x4A, 0x5C);
|
|
MediaColor text = isLight ? MediaColor.FromRgb(0x1A, 0x1A, 0x1A) : MediaColor.FromRgb(0xF3, 0xF3, 0xF3);
|
|
MediaColor muted = isLight ? MediaColor.FromRgb(0x66, 0x66, 0x66) : MediaColor.FromRgb(0xB8, 0xB8, 0xB8);
|
|
MediaColor border = isLight ? MediaColor.FromRgb(0xC8, 0xC8, 0xC8) : MediaColor.FromRgb(0x55, 0x55, 0x55);
|
|
MediaColor selectedText = IsDark(accent) ? System.Windows.Media.Colors.White : System.Windows.Media.Colors.Black;
|
|
|
|
SetBrush("AppWindowBrush", window);
|
|
SetBrush("AppSurfaceBrush", surface);
|
|
SetBrush("AppControlBrush", control);
|
|
SetBrush("AppControlHoverBrush", hover);
|
|
SetBrush("AppTextBrush", text);
|
|
SetBrush("AppMutedTextBrush", muted);
|
|
SetBrush("AppBorderBrush", border);
|
|
SetBrush("AppAccentBrush", accent);
|
|
SetBrush("AppSelectedTextBrush", selectedText);
|
|
|
|
SetBrush(System.Windows.SystemColors.WindowBrushKey, surface);
|
|
SetBrush(System.Windows.SystemColors.WindowTextBrushKey, text);
|
|
SetBrush(System.Windows.SystemColors.ControlBrushKey, control);
|
|
SetBrush(System.Windows.SystemColors.ControlTextBrushKey, text);
|
|
SetBrush(System.Windows.SystemColors.ControlDarkBrushKey, border);
|
|
SetBrush(System.Windows.SystemColors.HighlightBrushKey, accent);
|
|
SetBrush(System.Windows.SystemColors.HighlightTextBrushKey, selectedText);
|
|
}
|
|
|
|
private static bool IsLightTheme()
|
|
{
|
|
object? value = Registry.CurrentUser.OpenSubKey(PersonalizeKey)?.GetValue("AppsUseLightTheme");
|
|
return value is null || Convert.ToInt32(value) != 0;
|
|
}
|
|
|
|
private static MediaColor GetAccentColor()
|
|
{
|
|
object? value = Registry.CurrentUser.OpenSubKey(DwmKey)?.GetValue("AccentColor");
|
|
if (value is int colorValue)
|
|
{
|
|
byte r = (byte)(colorValue & 0xFF);
|
|
byte g = (byte)((colorValue >> 8) & 0xFF);
|
|
byte b = (byte)((colorValue >> 16) & 0xFF);
|
|
return MediaColor.FromRgb(r, g, b);
|
|
}
|
|
|
|
return MediaColor.FromRgb(0x00, 0x78, 0xD4);
|
|
}
|
|
|
|
private static void SetBrush(string key, MediaColor color)
|
|
{
|
|
SolidColorBrush brush = new(color);
|
|
brush.Freeze();
|
|
System.Windows.Application.Current.Resources[key] = brush;
|
|
}
|
|
|
|
private static void SetBrush(ResourceKey key, MediaColor color)
|
|
{
|
|
SolidColorBrush brush = new(color);
|
|
brush.Freeze();
|
|
System.Windows.Application.Current.Resources[key] = brush;
|
|
}
|
|
|
|
private static bool IsDark(MediaColor color)
|
|
{
|
|
double luminance = (0.299 * color.R) + (0.587 * color.G) + (0.114 * color.B);
|
|
return luminance < 140;
|
|
}
|
|
}
|