Windows10/11には設定の[色]にダークモードとライトモードがあり、システムやアプリのウィンドウの配色を変更する設定があります。この設定をC#から取得する方法を備忘録的に投稿します。
[個人用設定 > 色]設定
Windows10の時代から実装された「ダークモード」設定。最新のWindows11では[個人用設定 > 色]の[モードを選ぶ]という設定項目になっています。
C#の場合、Microsoft.UI.Xaml ライブラリを通して取得できるメソッドが用意されています。UWPなどXamlを使ったインターフェイスを実装している場合は楽にできます。
しかし、Windowsフォームアプリのような古いアプリケーションからMicrosoft.UI.Xaml ライブラリを使う方法が見つからなかったので、別の方法を探してみました。
レジストリから取得
[モードを選ぶ]の設定値は、下のレジストリに保持されています。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize\
例えば[ライト]設定の場合には
[SystemUsesLightTheme]サブキーにDWORD値 1として設定されています。
[ダーク]設定の場合には
[SystemUsesLightTheme]サブキーにDWORD値 0として設定されています。
[カスタム]設定の場合には、サブキーが1つ増えて2つ値で保持されています。
[既定のWindowsモードを設定してください]が[SystemUsesLightTheme]サブキーにDWORD値で設定され、[既定のアプリ モードを選択します]が[AppsUsesLightTheme]サブキーに保存されます。
C#から取得
レジストリに保存されているのが分かれば、後は昔ながらの方法で取得できます。不必要なライブラリやアセンブリを追加しなくても、Win32APIを呼び出す要領で取得ができます。
例えば、[SystemUsesLightTheme]サブキーを取得するには、こんな感じ。
using Microsoft.Win32;
...
private int GetSystemUsesLightTheme()
{
int nResult = -1;
string sKeyName = @"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize";
string sSubkeyName = "SystemUsesLightTheme";
Microsoft.Win32.RegistryKey rKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(sKeyName);
nResult = (int)rKey.GetValue(sSubkeyName);
rKey.Close();
return nResult;
}
[AppsUsesLightTheme]サブキーも少し改造すれば、取得できます。
後は、ダークモードとライトモードの時に画面の配色を変える仕組みを実装します。
まとめ
Windows10/11のダークモード設定は、まだレジストリに保存されています。(これから無くなる可能性がありますが)
Windowsフォームアプリのように、Xaml系のアセンブリが使い辛い場合には割り切ってレジストリから取得した方が早いかもしれない。
スポンサーリンク
最後までご覧いただき、ありがとうございます。