From 6a0f6f1672ad4782991b79158062791221e4e894 Mon Sep 17 00:00:00 2001 From: Yuhang Zhao <2546789017@qq.com> Date: Sat, 4 Apr 2020 16:35:47 +0800 Subject: [PATCH] Update. Signed-off-by: Yuhang Zhao <2546789017@qq.com> --- main.cpp | 4 +--- winnativeeventfilter.cpp | 51 ++++++++++++++++++++++++++++++++++++++++ winnativeeventfilter.h | 4 ++++ 3 files changed, 56 insertions(+), 3 deletions(-) diff --git a/main.cpp b/main.cpp index 5258273..ba7db5a 100644 --- a/main.cpp +++ b/main.cpp @@ -18,10 +18,8 @@ int main(int argc, char *argv[]) { QApplication application(argc, argv); - WinNativeEventFilter::install(); - QWidget widget; - WinNativeEventFilter::updateQtFrame(widget.windowHandle()); + WinNativeEventFilter::addFramelessWindow(&widget); widget.show(); return QApplication::exec(); diff --git a/winnativeeventfilter.cpp b/winnativeeventfilter.cpp index 184cbbc..fdfd937 100644 --- a/winnativeeventfilter.cpp +++ b/winnativeeventfilter.cpp @@ -27,8 +27,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -926,3 +928,52 @@ void WinNativeEventFilter::setTitlebarHeight(int tbh) { m_titlebarHeight = tbh; } } + +void WinNativeEventFilter::setFramelessWindows(QVector windows) { + if (!windows.isEmpty()) { + for (auto &&window : qAsConst(windows)) { + addFramelessWindow(window); + } + } +} + +void WinNativeEventFilter::addFramelessWindow(QObject *window, + WINDOWDATA *data) { + if (window) { + const auto getWindowHandle = [](QWindow *win) -> HWND { + if (win && win->handle()) { + const auto handle = + QGuiApplication::platformNativeInterface() + ->nativeResourceForWindow("handle", win); + if (handle) { + return static_cast(handle); + } + } + return reinterpret_cast(win->winId()); + }; + HWND hwnd = nullptr; + if (window->isWidgetType()) { + const auto widget = qobject_cast(window); + if (widget) { + QWindow *const _window = widget->windowHandle(); + if (_window) { + hwnd = getWindowHandle(_window); + } else { + hwnd = reinterpret_cast(widget->winId()); + } + } + } else if (window->isWindowType()) { + const auto _window = qobject_cast(window); + if (_window) { + hwnd = getWindowHandle(_window); + } + } else { + qWarning().noquote() << "Only QWidget and QWindow are accepted."; + } + if (hwnd) { + addFramelessWindow(hwnd, data); + } else { + qWarning().noquote() << "Failed to acquire window handle."; + } + } +} diff --git a/winnativeeventfilter.h b/winnativeeventfilter.h index ff816f1..a0f3ee5 100644 --- a/winnativeeventfilter.h +++ b/winnativeeventfilter.h @@ -30,6 +30,7 @@ #include QT_BEGIN_NAMESPACE +QT_FORWARD_DECLARE_CLASS(QObject) QT_FORWARD_DECLARE_CLASS(QWindow) QT_END_NAMESPACE @@ -63,9 +64,12 @@ public: // Frameless windows handle list static QVector framelessWindows(); static void setFramelessWindows(QVector windows); + static void setFramelessWindows(QVector windows); // Make the given window become frameless. static void addFramelessWindow(HWND window, WINDOWDATA *data = nullptr); + static void addFramelessWindow(QObject *window, WINDOWDATA *data = nullptr); static void removeFramelessWindow(HWND window); + static void removeFramelessWindow(QObject *window); static void clearFramelessWindows(); // Set borderWidth, borderHeight or titlebarHeight to a negative value to