src/core/qwindowkit_windows.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/core/qwindowkit_windows.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/core/shared/qwkwindowsextra_p.h | ●●●●● 补丁 | 查看 | 原始文档 | 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 {}; } @@ -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);