diff --git a/winnativeeventfilter.cpp b/winnativeeventfilter.cpp index e1b65f1..d8bf62c 100644 --- a/winnativeeventfilter.cpp +++ b/winnativeeventfilter.cpp @@ -32,7 +32,6 @@ #endif #include #include -#include #include #include @@ -215,7 +214,7 @@ QVector m_framelessWindows; WinNativeEventFilter::WinNativeEventFilter() { initWin32Api(); } -WinNativeEventFilter::~WinNativeEventFilter() = default; +WinNativeEventFilter::~WinNativeEventFilter() { removeUserData(); }; void WinNativeEventFilter::install() { if (m_instance.isNull()) { @@ -494,7 +493,7 @@ bool WinNativeEventFilter::nativeEventFilter(const QByteArray &eventType, const auto isInSpecificAreas = [](int x, int y, const QVector &areas, qreal dpr) -> bool { - for (auto &&area : qAsConst(areas)) { + for (auto &&area : std::as_const(areas)) { if (!area.isValid()) { continue; } @@ -914,3 +913,15 @@ qreal WinNativeEventFilter::getPreferedNumber(qreal num) { #endif return result; } + +void WinNativeEventFilter::removeUserData() { + // TODO: all top level windows of QGuiApplication. + if (!m_framelessWindows.isEmpty()) { + for (auto &&window : std::as_const(m_framelessWindows)) { + const auto userData = reinterpret_cast(m_lpGetWindowLongPtrW(window, GWLP_USERDATA)); + if (userData) { + delete userData; + } + } + } +} diff --git a/winnativeeventfilter.h b/winnativeeventfilter.h index 79ed7fd..8d1724e 100644 --- a/winnativeeventfilter.h +++ b/winnativeeventfilter.h @@ -54,6 +54,9 @@ public: ~WinNativeEventFilter() override; // Make all top level windows become frameless, unconditionally. + // Use setFramelessWindows or addFramelessWindow if possible, + // because this method will cause strange behavior, currently + // don't know why. static void install(); // Make all top level windows back to normal. static void uninstall(); @@ -107,4 +110,5 @@ private: static UINT getDotsPerInchForWindow(HWND handle); static qreal getDevicePixelRatioForWindow(HWND handle); static int getSystemMetricsForWindow(HWND handle, int index); + void removeUserData(); };