wpf/winform獲取windows10系統顏色和主題色

原文: wpf/winform獲取windows10系統顏色和主題色

Windows10開始微軟在系統顏色中添加了深色,對於UWP來講很輕鬆就能獲取到系統當前的顏色和主題色,而對於Win32應用就沒有那麼直觀了。
在wpf中,能夠經過SystemParameters.WindowGlassBrush獲取一個近似的顏色,也沒辦法跟隨着系統顏色的變化而變化,對於強迫症來講這是難以忍受的。
其實系統顏色發生改變的時候,系統會給全部應用程序窗口發送顏色改變的消息,只要正確處理這個消息就能獲取到系統當前的顏色和主題色了。html

WM_DWMCOLORIZATIONCOLORCHANGED = 0x0320

固然還可使用一個更簡單的方法。若是你在使用.Net Framework,應該能夠直接使用;若是你在使用.Net Core版本的wpf和winform,須要使用nuget安裝Microsoft.Win32.SystemEvents
以後監聽SystemEvents.UserPreferenceChanged事件,當主題或顏色被改變時事件將會被觸發。固然,還有不少狀況這個事件會被觸發,須要咱們響應的時候判斷一下顏色是否是真的改變了。windows

AccentColor

獲取顏色有使用DwmGetColorizationParameters api和讀取註冊表兩種方式,個人建議是經過讀取註冊表來獲取顏色。由於DwmGetColorizationParameters這個api是未公開的,微軟指不定何時就刪掉了(雖然可能性極小)。
關於DwmGetColorizationParameters的使用方式請自行必應,咱們在這裏使用讀取註冊表的方式。注意若是使用.Net Core,須要使用nuget安裝Microsoft.Win32.Registry。註冊表路徑爲:api

計算機\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\DWM

讀取其中的ColorizationColor字段,格式爲0xAARRGGBB,下面給出一個簡單的轉換示例:spa

private Color ConvertToColor(int value) {
    return Color.FromArgb(
        (byte)(value >> 24),
        (byte)(value >> 16),
        (byte)(value >> 8),
        (byte)value
    );
}

這個路徑下還有不少其餘的字段,諸如是否開啓透明,混合顏色之類的,對於Win10已經沒有效果了,咱們不用去管它。code

ActualTheme

相似的,系統的深色淺色也能夠從另外一個註冊表位置獲取到:orm

計算機\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize

與顏色的區別是,這個彷佛沒有api去獲取,至少我沒找到23333
咱們須要的是控制應用主題是的AppsUseLightTheme,控制系統主題色的SystemUsesLightTheme和控制系統是否開啓透明的EnableTransparency這三個字段。
在Win10 1903以前的版本,系統的主題色設置只是控制應用顏色,因此是沒有SystemUsesLightTheme這個字段的。在使用的時候必定注意判斷字段是否存在。
使用上面的顏色和系統主題色,應該足夠咱們的應用適配系統顏色了。
個人博客: 超威藍火htm

相關文章
相關標籤/搜索