Windows10開始微軟在系統顏色中添加了深色,對於UWP來講很輕鬆就能獲取到系統當前的顏色和主題色,而對於Win32應用就沒有那麼直觀了。
在wpf中,能夠經過SystemParameters.WindowGlassBrush
獲取一個近似的顏色,也沒辦法跟隨着系統顏色的變化而變化,對於強迫症來講這是難以忍受的。
其實系統顏色發生改變的時候,系統會給全部應用程序窗口發送顏色改變的消息,只要正確處理這個消息就能獲取到系統當前的顏色和主題色了。html
WM_DWMCOLORIZATIONCOLORCHANGED = 0x0320
固然還可使用一個更簡單的方法。若是你在使用.Net Framework,應該能夠直接使用;若是你在使用.Net Core版本的wpf和winform,須要使用nuget安裝Microsoft.Win32.SystemEvents
。
以後監聽SystemEvents.UserPreferenceChanged
事件,當主題或顏色被改變時事件將會被觸發。固然,還有不少狀況這個事件會被觸發,須要咱們響應的時候判斷一下顏色是否是真的改變了。windows
獲取顏色有使用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
相似的,系統的深色淺色也能夠從另外一個註冊表位置獲取到:orm
計算機\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize
與顏色的區別是,這個彷佛沒有api去獲取,至少我沒找到23333
咱們須要的是控制應用主題是的AppsUseLightTheme
,控制系統主題色的SystemUsesLightTheme
和控制系統是否開啓透明的EnableTransparency
這三個字段。
在Win10 1903以前的版本,系統的主題色設置只是控制應用顏色,因此是沒有SystemUsesLightTheme
這個字段的。在使用的時候必定注意判斷字段是否存在。
使用上面的顏色和系統主題色,應該足夠咱們的應用適配系統顏色了。
個人博客: 超威藍火htm