前置き
皆さんは設定からダークテーマにしたりだとか、ホワイトテーマにしたりだとか、アクセントカラーを付けたりして、大いにパソコンをカスタマイズしていますよね。
当然、wpfソフトではそこら辺の設定を反映できるようにしたいところです。
ですが、取得方法を探すのに時間がかかったのでメモ書きです。
前提条件
ここで一つ注意なのですが、これはWindows10(10.0.10240.0)から導入されたメソッドなので、ターゲットバージョンをwindows7からwindows10に引き上げなければなりません。
windows7も対象にするという方々は、従来通りDllImportとかしてやってください。最後にメモはしておきます。
取得してみる。
まず、おもむろにプロジェクトのプロパティを開いて、対象をWindows10にします。
これで使えるようになるので
UISettings settings = new UISettings(); // Windows.UI.Color
var foreground = settings.GetColorValue(UIColorType.Foreground);
var background = settings.GetColorValue(UIColorType.Background);
var accentcolor = settings.GetColorValue(UIColorType.Accent);
とかいう感じで適当にコードを打ち込みます。
とかいう公式ドキュメントを見ると分かりますが、
このUIのカラー情報などを取得する以外にも、ダブルクリックの許容時間やらEventやらが多々あり、中々にしっかりしています。
ユーザー情報を取得するなら一番楽だと思います。
UIColorType一覧は上のURLです。参考にしましょう。
アクセントカラーが変更されたら即座に色を変更するのも、ここのイベントハンドラーを使えば行けると思います。
DllImportを使う
これは参考にした人の完全なパクリなので、あまり書きたくはないのですが、まとめておきます。
[DllImport("uxtheme.dll", EntryPoint = "#95")]
public static extern uint GetImmersiveColorFromColorSetEx(uint dwImmersiveColorSet, uint dwImmersiveColorType, bool bIgnoreHighContrast, uint dwHighContrastCacheMode);
[DllImport("uxtheme.dll", EntryPoint = "#96")]
public static extern uint GetImmersiveColorTypeFromName(IntPtr pName);
[DllImport("uxtheme.dll", EntryPoint = "#98")]
public static extern int GetImmersiveUserColorSetPreference(bool bForceCheckRegistry, bool bSkipCheckOnFail);
public Color GetThemeColor() // アクセントカラー取得
{
var colorSetEx = GetImmersiveColorFromColorSetEx(
(uint)GetImmersiveUserColorSetPreference(false, false),
GetImmersiveColorTypeFromName(Marshal.StringToHGlobalUni("ImmersiveStartSelectionBackground")),
false, 0);
var colour = Color.FromArgb((byte)((0xFF000000 & colorSetEx) >> 24), (byte)(0x000000FF & colorSetEx),
(byte)((0x0000FF00 & colorSetEx) >> 8), (byte)((0x00FF0000 & colorSetEx) >> 16));
return colour;
}
参考