From 782a52020a9823bb7dc744ab20849f2558b64652 Mon Sep 17 00:00:00 2001 From: Sine Striker <trueful@163.com> Date: 周六, 14 12月 2024 17:23:54 +0800 Subject: [PATCH] Update WinRegistry --- src/core/shared/qwkwindowsextra_p.h | 33 +++++++++++----- src/core/qwindowkit_windows.h | 55 +++++++++++---------------- src/core/qwindowkit_windows.cpp | 5 -- 3 files changed, 44 insertions(+), 49 deletions(-) diff --git a/src/core/qwindowkit_windows.cpp b/src/core/qwindowkit_windows.cpp index c022e26..58c3d0f 100644 --- a/src/core/qwindowkit_windows.cpp +++ b/src/core/qwindowkit_windows.cpp @@ -87,10 +87,5 @@ reinterpret_cast<unsigned char *>(&value), &size) == ERROR_SUCCESS; return qMakePair(value, ok); } -#elif QT_VERSION < QT_VERSION_CHECK(6, 8, 1) - WindowsRegistryKey::WindowsRegistryKey(HKEY parentHandle, QStringView subKey, REGSAM permissions, REGSAM access) - : QWinRegistryKey(parentHandle, subKey, permissions, access) - { - } #endif } \ No newline at end of file diff --git a/src/core/qwindowkit_windows.h b/src/core/qwindowkit_windows.h index 8c5c7c0..d6c0afe 100644 --- a/src/core/qwindowkit_windows.h +++ b/src/core/qwindowkit_windows.h @@ -62,22 +62,22 @@ inline bool IsWindows1122H2OrGreater_Real() { RTL_OSVERSIONINFOW rovi = GetRealOSVersion(); return (rovi.dwMajorVersion > 10) || - (rovi.dwMajorVersion == 10 && (rovi.dwMinorVersion > 0 || - rovi.dwBuildNumber >= 22621)); + (rovi.dwMajorVersion == 10 && + (rovi.dwMinorVersion > 0 || rovi.dwBuildNumber >= 22621)); } inline bool IsWindows11OrGreater_Real() { RTL_OSVERSIONINFOW rovi = GetRealOSVersion(); return (rovi.dwMajorVersion > 10) || - (rovi.dwMajorVersion == 10 && (rovi.dwMinorVersion > 0 || - rovi.dwBuildNumber >= 22000)); + (rovi.dwMajorVersion == 10 && + (rovi.dwMinorVersion > 0 || rovi.dwBuildNumber >= 22000)); } inline bool IsWindows1020H1OrGreater_Real() { RTL_OSVERSIONINFOW rovi = GetRealOSVersion(); return (rovi.dwMajorVersion > 10) || - (rovi.dwMajorVersion == 10 && (rovi.dwMinorVersion > 0 || - rovi.dwBuildNumber >= 19041)); + (rovi.dwMajorVersion == 10 && + (rovi.dwMinorVersion > 0 || rovi.dwBuildNumber >= 19041)); } inline bool IsWindows102004OrGreater_Real() { @@ -87,8 +87,8 @@ inline bool IsWindows101903OrGreater_Real() { RTL_OSVERSIONINFOW rovi = GetRealOSVersion(); return (rovi.dwMajorVersion > 10) || - (rovi.dwMajorVersion == 10 && (rovi.dwMinorVersion > 0 || - rovi.dwBuildNumber >= 18362)); + (rovi.dwMajorVersion == 10 && + (rovi.dwMinorVersion > 0 || rovi.dwBuildNumber >= 18362)); } inline bool IsWindows1019H1OrGreater_Real() { @@ -98,8 +98,8 @@ inline bool IsWindows101809OrGreater_Real() { RTL_OSVERSIONINFOW rovi = GetRealOSVersion(); return (rovi.dwMajorVersion > 10) || - (rovi.dwMajorVersion == 10 && (rovi.dwMinorVersion > 0 || - rovi.dwBuildNumber >= 17763)); + (rovi.dwMajorVersion == 10 && + (rovi.dwMinorVersion > 0 || rovi.dwBuildNumber >= 17763)); } inline bool IsWindows10RS5OrGreater_Real() { @@ -147,9 +147,6 @@ QString stringValue(QStringView subKey) const; QPair<DWORD, bool> dwordValue(QStringView subKey) const; - template<typename T> - std::optional<T> value(QStringView subKey) const; - private: HKEY m_key; @@ -159,34 +156,26 @@ inline bool WindowsRegistryKey::isValid() const { return m_key != nullptr; } - - template<> - inline std::optional<DWORD> WindowsRegistryKey::value(QStringView subKey) const { - const auto dv = dwordValue(subKey); - if (!dv.second) { - return {}; - } - return dv.first; - } #elif QT_VERSION < QT_VERSION_CHECK(6, 8, 1) + using WindowsRegistryKey = QWinRegistryKey; +#else class WindowsRegistryKey : public QWinRegistryKey { public: - WindowsRegistryKey(HKEY parentHandle, QStringView subKey, REGSAM permissions = KEY_READ, REGSAM access = 0); + WindowsRegistryKey(HKEY parentHandle, QStringView subKey, REGSAM permissions = KEY_READ, + REGSAM access = 0) + : QWinRegistryKey(parentHandle, subKey, permissions, access) { + } - template<typename T> - std::optional<T> value(QStringView subKey) const; + inline QPair<DWORD, bool> dwordValue(QStringView subKey) const; }; - template<> - inline std::optional<DWORD> WindowsRegistryKey::value(QStringView subKey) const { - const auto dv = dwordValue(subKey); - if (!dv.second) { - return {}; + inline QPair<DWORD, bool> WindowsRegistryKey::dwordValue(QStringView subKey) const { + const auto val = value<DWORD>(subKey); + if (!val) { + return {0, false}; } - return dv.first; + return {val.value(), true}; } -#else - using WindowsRegistryKey = QWinRegistryKey; #endif // diff --git a/src/core/shared/qwkwindowsextra_p.h b/src/core/shared/qwkwindowsextra_p.h index b56f2eb..2147cc4 100644 --- a/src/core/shared/qwkwindowsextra_p.h +++ b/src/core/shared/qwkwindowsextra_p.h @@ -19,11 +19,14 @@ #include <timeapi.h> #include <QWKCore/qwindowkit_windows.h> -#include <QtCore/private/qsystemlibrary_p.h> +#include <QtCore/QtMath> +#include <QtCore/QPair> #include <QtGui/QGuiApplication> #include <QtGui/QStyleHints> #include <QtGui/QPalette> + +#include <QtCore/private/qsystemlibrary_p.h> // Don't include this header in any header files. @@ -345,8 +348,11 @@ if (!registry.isValid()) { return false; } - auto value = registry.value<DWORD>(L"ColorPrevalence"); - return value.value_or(false); + auto value = registry.dwordValue(L"ColorPrevalence"); + if (!value.second) { + return false; + } + return value.first; } inline bool isHighContrastModeEnabled() { @@ -368,8 +374,11 @@ if (!registry.isValid()) { return false; } - auto value = registry.value<DWORD>(L"AppsUseLightTheme"); - return value.value_or(false); + auto value = registry.dwordValue(L"AppsUseLightTheme"); + if (!value.second) { + return false; + } + return !value.first; #endif } @@ -379,8 +388,10 @@ } BOOL enabled = FALSE; const DynamicApis &apis = DynamicApis::instance(); - const auto attr = isWin1020H1OrGreater() ? _DWMWA_USE_IMMERSIVE_DARK_MODE : _DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1; - return SUCCEEDED(apis.pDwmGetWindowAttribute(hwnd, attr, &enabled, sizeof(enabled))) && enabled; + const auto attr = isWin1020H1OrGreater() ? _DWMWA_USE_IMMERSIVE_DARK_MODE + : _DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1; + return SUCCEEDED(apis.pDwmGetWindowAttribute(hwnd, attr, &enabled, sizeof(enabled))) && + enabled; } inline QColor getAccentColor() { @@ -391,13 +402,13 @@ if (!registry.isValid()) { return {}; } - auto value = registry.value<DWORD>(L"AccentColor"); - if (!value) { + auto value = registry.dwordValue(L"AccentColor"); + if (!value.second) { return {}; } // The retrieved value is in the #AABBGGRR format, we need to // convert it to the #AARRGGBB format which Qt expects. - QColor color = QColor::fromRgba(*value); + QColor color = QColor::fromRgba(value.first); if (!color.isValid()) { return {}; } @@ -407,7 +418,7 @@ inline quint32 getDpiForWindow(HWND hwnd) { const DynamicApis &apis = DynamicApis::instance(); - if (apis.pGetDpiForWindow) { // Win10 + if (apis.pGetDpiForWindow) { // Win10 return apis.pGetDpiForWindow(hwnd); } else if (apis.pGetDpiForMonitor) { // Win8.1 HMONITOR monitor = ::MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); -- Gitblit v1.9.1