// sktoolslib - common files for SK tools // Copyright (C) 2018, 2020-2021 - Stefan Kueng // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software Foundation, // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. // #include "stdafx.h" #include "Windows10Colors.h" #pragma comment(lib, "dwmapi.lib") #pragma comment(lib, "ntdll.lib") using namespace Microsoft::WRL; namespace WindowsUI = ABI::Windows::UI; /// Wrapper class for WinRT string reference class HStringRef { HSTRING m_hStr; HSTRING_HEADER m_strHeader; public: HStringRef() : m_hStr(nullptr) , m_strHeader() { } // String ref doesn't need dtor template HRESULT Set(const wchar_t (&str)[N]) { return Win10Colors::WindowsCreateStringReference(str, N - 1, &m_strHeader, &m_hStr); } operator HSTRING() const { return m_hStr; } }; /// Call RoActivateInstance and query an interface template static HRESULT ActivateInstance(HSTRING classId, ComPtr& instance) { ComPtr inspectable; auto hr = Win10Colors::RoActivateInstance(classId, &inspectable); if (FAILED(hr)) return hr; return inspectable.As(&instance); } Win10Colors Win10Colors::instance; Win10Colors::Win10Colors() { if (!m_modulesLoaded) { m_modulesLoaded = true; winrt = LoadLibraryW(L"api-ms-win-core-winrt-l1-1-0.dll"); if (winrt) { pRoActivateInstance = reinterpret_cast( GetProcAddress(winrt, "RoActivateInstance")); } m_winrtString = LoadLibraryW(L"api-ms-win-core-winrt-string-l1-1-0.dll"); if (m_winrtString) { pWindowsCreateStringReference = reinterpret_cast( GetProcAddress(m_winrtString, "WindowsCreateStringReference")); } } } Win10Colors::~Win10Colors() { if (winrt) FreeLibrary(winrt); if (m_winrtString) FreeLibrary(m_winrtString); } HRESULT Win10Colors::GetAccentColor(AccentColor& color) { HStringRef classId; auto hr = classId.Set(L"Windows.UI.ViewManagement.UISettings"); if (FAILED(hr)) return hr; Microsoft::WRL::ComPtr settings; hr = ActivateInstance(classId, settings); if (FAILED(hr)) return hr; ComPtr settings3; hr = settings.As(&settings3); if (!settings3) return E_FAIL; WindowsUI::Color uiColor; hr = settings3->GetColorValue(WindowsUI::ViewManagement::UIColorType_Foreground, &uiColor); if (FAILED(hr)) return hr; color.foreground = ToRGBA(uiColor); hr = settings3->GetColorValue(WindowsUI::ViewManagement::UIColorType_Background, &uiColor); if (FAILED(hr)) return hr; color.background = ToRGBA(uiColor); hr = settings3->GetColorValue(WindowsUI::ViewManagement::UIColorType_AccentDark3, &uiColor); if (FAILED(hr)) return hr; color.darkest = ToRGBA(uiColor); hr = settings3->GetColorValue(WindowsUI::ViewManagement::UIColorType_AccentDark2, &uiColor); if (FAILED(hr)) return hr; color.darker = ToRGBA(uiColor); hr = settings3->GetColorValue(WindowsUI::ViewManagement::UIColorType_AccentDark1, &uiColor); if (FAILED(hr)) return hr; color.dark = ToRGBA(uiColor); hr = settings3->GetColorValue(WindowsUI::ViewManagement::UIColorType_Accent, &uiColor); if (FAILED(hr)) return hr; color.accent = ToRGBA(uiColor); hr = settings3->GetColorValue(WindowsUI::ViewManagement::UIColorType_AccentLight1, &uiColor); if (FAILED(hr)) return hr; color.light = ToRGBA(uiColor); hr = settings3->GetColorValue(WindowsUI::ViewManagement::UIColorType_AccentLight2, &uiColor); if (FAILED(hr)) return hr; color.lighter = ToRGBA(uiColor); hr = settings3->GetColorValue(WindowsUI::ViewManagement::UIColorType_AccentLight3, &uiColor); if (FAILED(hr)) return hr; color.lightest = ToRGBA(uiColor); return S_OK; }