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這個欄位的,在使用的時候一定注意判斷欄位是否存在,
使用上面的顏色和系統主題色,應該足夠我們的應用適配系統顏色了,
我的博客: 超威藍火
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/22570.html
標籤:WPF
下一篇:WPF CefSharp 爬蟲
