From e57ce2dc374769f7f6acf5715659a4cd0362feb3 Mon Sep 17 00:00:00 2001 From: okrc Date: Thu, 6 Oct 2022 02:16:24 +0800 Subject: [PATCH] Add dark title bar support for Windows 11. --- SandboxiePlus/SandMan/SandMan.cpp | 42 +++++++++++++++++++++++++++++++ SandboxiePlus/SandMan/SandMan.h | 2 ++ 2 files changed, 44 insertions(+) diff --git a/SandboxiePlus/SandMan/SandMan.cpp b/SandboxiePlus/SandMan/SandMan.cpp index a62086be..c4d5b01c 100644 --- a/SandboxiePlus/SandMan/SandMan.cpp +++ b/SandboxiePlus/SandMan/SandMan.cpp @@ -83,6 +83,12 @@ public: if (theGUI && theConf->GetInt("Options/UseDarkTheme", 2) == 2) theGUI->UpdateTheme(); } + else if (msg->message == WM_SHOWWINDOW && msg->wParam) + { + QWidget* pWidget = QWidget::find((WId)msg->hwnd); + if (theGUI && pWidget && (pWidget->windowType() | Qt::Dialog) == Qt::Dialog) + theGUI->UpdateTitleTheme(msg->hwnd); + } } return false; } @@ -2919,6 +2925,37 @@ void CSandMan::SetUITheme() font.setPointSizeF(newFontSize); QApplication::setFont(font); } + +#if defined(Q_OS_WIN) + foreach(QWidget * pWidget, QApplication::topLevelWidgets()) + { + if (pWidget->isVisible()) + SetTitleTheme((HWND)pWidget->winId()); + } +#endif +} + +void CSandMan::SetTitleTheme(const HWND& hwnd) +{ + static const int CurrentVersion = QSettings("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", + QSettings::NativeFormat).value("CurrentBuild").toInt(); + if (CurrentVersion < 22000) // Windows 11- + return; + + HMODULE dwmapi = GetModuleHandle(L"dwmapi.dll"); + if (dwmapi) + { + typedef HRESULT(WINAPI* P_DwmSetWindowAttribute)(HWND, DWORD, LPCVOID, DWORD); + P_DwmSetWindowAttribute pDwmSetWindowAttribute = reinterpret_cast(GetProcAddress(dwmapi, "DwmSetWindowAttribute")); + if (pDwmSetWindowAttribute) + { +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + BOOL value = m_DarkTheme; + pDwmSetWindowAttribute(hwnd, DWMWA_USE_IMMERSIVE_DARK_MODE, &value, sizeof(value)); + } + } } void CSandMan::UpdateTheme() @@ -2930,6 +2967,11 @@ void CSandMan::UpdateTheme() } } +void CSandMan::UpdateTitleTheme(const HWND& hwnd) +{ + SetTitleTheme(hwnd); +} + void CSandMan::LoadLanguage() { QString Lang = theConf->GetString("Options/UiLanguage"); diff --git a/SandboxiePlus/SandMan/SandMan.h b/SandboxiePlus/SandMan/SandMan.h index 177d1c05..1a5e1c40 100644 --- a/SandboxiePlus/SandMan/SandMan.h +++ b/SandboxiePlus/SandMan/SandMan.h @@ -72,6 +72,7 @@ public: bool CheckCertificate(QWidget* pWidget); void UpdateTheme(); + void UpdateTitleTheme(const HWND& hwnd); void UpdateCertState(); @@ -221,6 +222,7 @@ private slots: void OnSysTray(QSystemTrayIcon::ActivationReason Reason); void SetUITheme(); + void SetTitleTheme(const HWND& hwnd); void AddLogMessage(const QString& Message); void AddFileRecovered(const QString& BoxName, const QString& FilePath);