Windows10開始微軟在系統顏色中添加了深色,對於UWP來說很輕鬆就能獲取到系統當前的顏色和主題色,而對於Win32應用就沒有那麼直觀了。 ...
Windows10開始微軟在系統顏色中添加了深色,對於UWP來說很輕鬆就能獲取到系統當前的顏色和主題色,而對於Win32應用就沒有那麼直觀了。
在wpf中,可以通過SystemParameters.WindowGlassBrush
獲取一個近似的顏色,也沒辦法跟隨著系統顏色的變化而變化,對於強迫症來說這是難以忍受的。
其實系統顏色發生改變的時候,系統會給所有應用程式視窗發送顏色改變的消息,只要正確處理這個消息就能獲取到系統當前的顏色和主題色了。
WM_DWMCOLORIZATIONCOLORCHANGED = 0x0320
當然還可以使用一個更簡單的方法。如果你在使用.Net Framework,應該可以直接使用;如果你在使用.Net Core版本的wpf和winform,需要使用nuget安裝Microsoft.Win32.SystemEvents
。
之後監聽SystemEvents.UserPreferenceChanged
事件,當主題或顏色被改變時事件將會被觸發。當然,還有很多情況這個事件會被觸發,需要我們響應的時候判斷一下顏色是不是真的改變了。
AccentColor
獲取顏色有使用DwmGetColorizationParameters api和讀取註冊表兩種方式,我的建議是通過讀取註冊表來獲取顏色。因為DwmGetColorizationParameters這個api是未公開的,微軟指不定什麼時候就刪掉了(雖然可能性極小)。
關於DwmGetColorizationParameters的使用方式請自行必應,我們在這裡使用讀取註冊表的方式。註意如果使用.Net Core,需要使用nuget安裝Microsoft.Win32.Registry
。註冊表路徑為:
電腦\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\DWM
讀取其中的ColorizationColor
欄位,格式為0xAARRGGBB
,下麵給出一個簡單的轉換示例:
private Color ConvertToColor(int value)
{
return Color.FromArgb(
(byte)(value >> 24),
(byte)(value >> 16),
(byte)(value >> 8),
(byte)value
);
}
這個路徑下還有很多其他的欄位,諸如是否開啟透明,混合顏色之類的,對於Win10已經沒有效果了,我們不用去管它。
ActualTheme
類似的,系統的深色淺色也可以從另一個註冊表位置獲取到:
電腦\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize
與顏色的區別是,這個似乎沒有api去獲取,至少我沒找到23333
我們需要的是控制應用主題是的AppsUseLightTheme
,控制系統主題色的SystemUsesLightTheme
和控制系統是否開啟透明的EnableTransparency
這三個欄位。
在Win10 1903之前的版本,系統的主題色設置只是控制應用顏色,所以是沒有SystemUsesLightTheme
這個欄位的。在使用的時候一定註意判斷欄位是否存在。
使用上面的顏色和系統主題色,應該足夠我們的應用適配系統顏色了。
我的博客: 超威藍火