From f452e8edbf408d0e8c2283072372a17d409e2f0c Mon Sep 17 00:00:00 2001 From: quyenvsp Date: Sat, 16 Dec 2023 12:03:48 +0700 Subject: [PATCH] [FancyZones] Fix moved to the current active monitor when maximized --- .../fancyzones/FancyZonesLib/MonitorUtils.cpp | 2 +- .../fancyzones/FancyZonesLib/WindowUtils.cpp | 15 ++++++++++++++- .../fancyzones/FancyZonesLib/WindowUtils.h | 2 +- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/modules/fancyzones/FancyZonesLib/MonitorUtils.cpp b/src/modules/fancyzones/FancyZonesLib/MonitorUtils.cpp index 25e5a8b2178c..549e94cfd589 100644 --- a/src/modules/fancyzones/FancyZonesLib/MonitorUtils.cpp +++ b/src/modules/fancyzones/FancyZonesLib/MonitorUtils.cpp @@ -360,7 +360,7 @@ namespace MonitorUtils if (GetMonitorInfo(monitor, &destMi)) { RECT newPosition = FitOnScreen(placement.rcNormalPosition, originMi.rcWork, destMi.rcWork); - FancyZonesWindowUtils::SizeWindowToRect(window, newPosition); + FancyZonesWindowUtils::SizeWindowToRect(window, newPosition, false); } } } diff --git a/src/modules/fancyzones/FancyZonesLib/WindowUtils.cpp b/src/modules/fancyzones/FancyZonesLib/WindowUtils.cpp index fb68945154d2..77bad34683a7 100644 --- a/src/modules/fancyzones/FancyZonesLib/WindowUtils.cpp +++ b/src/modules/fancyzones/FancyZonesLib/WindowUtils.cpp @@ -253,7 +253,7 @@ void FancyZonesWindowUtils::SwitchToWindow(HWND window) noexcept } } -void FancyZonesWindowUtils::SizeWindowToRect(HWND window, RECT rect) noexcept +void FancyZonesWindowUtils::SizeWindowToRect(HWND window, RECT rect, BOOL snapZone) noexcept { WINDOWPLACEMENT placement{}; ::GetWindowPlacement(window, &placement); @@ -265,8 +265,15 @@ void FancyZonesWindowUtils::SizeWindowToRect(HWND window, RECT rect) noexcept ::GetWindowPlacement(window, &placement); } + BOOL maximizeLater = false; if (IsWindowVisible(window)) { + // If is not snap zone then need keep maximize state (move to active monitor) + if (!snapZone && placement.showCmd == SW_SHOWMAXIMIZED) + { + maximizeLater = true; + } + // Do not restore minimized windows. We change their placement though so they restore to the correct zone. if ((placement.showCmd != SW_SHOWMINIMIZED) && (placement.showCmd != SW_MINIMIZE)) @@ -294,6 +301,12 @@ void FancyZonesWindowUtils::SizeWindowToRect(HWND window, RECT rect) noexcept Logger::error(L"SetWindowPlacement failed, {}", get_last_error_or_default(GetLastError())); } + // make sure window is moved to the correct monitor before maximize. + if (maximizeLater) + { + placement.showCmd = SW_SHOWMAXIMIZED; + } + // Do it again, allowing Windows to resize the window and set correct scaling // This fixes Issue #365 result = ::SetWindowPlacement(window, &placement); diff --git a/src/modules/fancyzones/FancyZonesLib/WindowUtils.h b/src/modules/fancyzones/FancyZonesLib/WindowUtils.h index 72ea73e96f0c..9382bccf0b25 100644 --- a/src/modules/fancyzones/FancyZonesLib/WindowUtils.h +++ b/src/modules/fancyzones/FancyZonesLib/WindowUtils.h @@ -31,7 +31,7 @@ namespace FancyZonesWindowUtils bool IsExcludedByDefault(const HWND& hwnd, const std::wstring& processPath) noexcept; void SwitchToWindow(HWND window) noexcept; - void SizeWindowToRect(HWND window, RECT rect) noexcept; // Parameter rect must be in screen coordinates (e.g. obtained from GetWindowRect) + void SizeWindowToRect(HWND window, RECT rect, BOOL snapZone = true) noexcept; // Parameter rect must be in screen coordinates (e.g. obtained from GetWindowRect) void SaveWindowSizeAndOrigin(HWND window) noexcept; void RestoreWindowSize(HWND window) noexcept; void RestoreWindowOrigin(HWND window) noexcept;