Sine Striker
2024-12-14 782a52020a9823bb7dc744ab20849f2558b64652
Update WinRegistry
3个文件已修改
91 ■■■■ 已修改文件
src/core/qwindowkit_windows.cpp 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/core/qwindowkit_windows.h 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/core/shared/qwkwindowsextra_p.h 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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
}
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
    //
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 {};
        }