From f874811443991759df4231b5127788af059a0df9 Mon Sep 17 00:00:00 2001 From: Sine Striker <trueful@163.com> Date: 周二, 19 12月 2023 15:55:52 +0800 Subject: [PATCH] Add raise hook --- src/core/contexts/win32windowcontext.cpp | 42 ++++++++++++++++++++++++++++++++++++++---- 1 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/core/contexts/win32windowcontext.cpp b/src/core/contexts/win32windowcontext.cpp index cda9058..9b3e179 100644 --- a/src/core/contexts/win32windowcontext.cpp +++ b/src/core/contexts/win32windowcontext.cpp @@ -812,6 +812,26 @@ return; } + case RaiseWindowHook: { + if (m_windowHandle->windowStates() & Qt::WindowMinimized) + m_windowHandle->showNormal(); + + auto hWnd = reinterpret_cast<HWND>(windowId); + + // I have no idea what this does, but it works mostly + // https://www.codeproject.com/Articles/1724/Some-handy-dialog-box-tricks-tips-and-workarounds + + ::AttachThreadInput(::GetWindowThreadProcessId(::GetForegroundWindow(), nullptr), + ::GetCurrentThreadId(), TRUE); + + ::SetForegroundWindow(hWnd); + ::SetFocus(hWnd); + + ::AttachThreadInput(GetWindowThreadProcessId(GetForegroundWindow(), nullptr), + GetCurrentThreadId(), FALSE); + return; + } + case ShowSystemMenuHook: { const auto &pos = *static_cast<const QPoint *>(data); auto hWnd = reinterpret_cast<HWND>(windowId); @@ -824,6 +844,23 @@ showSystemMenu2(hWnd, qpoint2point(nativeGlobalPos), false, m_delegate->isHostSizeFixed(m_host)); return; + } + + case WindowAttributeChangedHook: { + auto args = static_cast<void **>(data); + const auto &key = *static_cast<const QString *>(args[0]); + const auto &newVar = *static_cast<const QVariant *>(args[1]); + const auto &oldVar = *static_cast<const QVariant *>(args[2]); + + if (key == QStringLiteral("no-frame-shadow")) { + if (newVar.toBool()) { + // TODO: set off + } else { + // TODO: set on + } + } + + break; } case DefaultColorsHook: { @@ -893,10 +930,7 @@ } void Win32WindowContext::winIdChanged(QWindow *oldWindow) { - if (oldWindow) { - removeManagedWindow(reinterpret_cast<HWND>(windowId)); - } - + removeManagedWindow(reinterpret_cast<HWND>(windowId)); if (!m_windowHandle) { return; } -- Gitblit v1.9.1