diff --git a/src/modules/fancyzones/FancyZonesLib/FancyZones.cpp b/src/modules/fancyzones/FancyZonesLib/FancyZones.cpp index 6980d7c511..bc843756f0 100644 --- a/src/modules/fancyzones/FancyZonesLib/FancyZones.cpp +++ b/src/modules/fancyzones/FancyZonesLib/FancyZones.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -376,28 +377,12 @@ void FancyZones::WindowCreated(HWND window) noexcept return; } - auto desktopId = VirtualDesktop::instance().GetDesktopId(window); - if (desktopId.has_value() && *desktopId != VirtualDesktop::instance().GetCurrentVirtualDesktopId()) - { - // Switch between virtual desktops results with posting same windows messages that also indicate - // creation of new window. We need to check if window being processed is on currently active desktop. - return; - } - - // Avoid processing splash screens, already stamped (zoned) windows, or those windows - // that belong to excluded applications list. - const bool isSplashScreen = FancyZonesWindowUtils::IsSplashScreen(window); - if (isSplashScreen) - { - return; - } - - const bool windowMinimized = IsIconic(window); - if (windowMinimized) + if (!FancyZonesWindowProcessing::IsProcessable(window)) { return; } + // Avoid already stamped (zoned) windows const bool isZoned = !FancyZonesWindowProperties::RetrieveZoneIndexProperty(window).empty(); if (isZoned) { @@ -1245,6 +1230,12 @@ void FancyZones::UpdateZoneSets() noexcept bool FancyZones::ShouldProcessSnapHotkey(DWORD vkCode) noexcept { auto window = GetForegroundWindow(); + + if (!FancyZonesWindowProcessing::IsProcessable(window)) + { + return false; + } + if (FancyZonesSettings::settings().overrideSnapHotkeys && FancyZonesWindowUtils::IsCandidateForZoning(window)) { HMONITOR monitor = WorkAreaKeyFromWindow(window); diff --git a/src/modules/fancyzones/FancyZonesLib/FancyZonesLib.vcxproj b/src/modules/fancyzones/FancyZonesLib/FancyZonesLib.vcxproj index 1124329657..11c3a51ffc 100644 --- a/src/modules/fancyzones/FancyZonesLib/FancyZonesLib.vcxproj +++ b/src/modules/fancyzones/FancyZonesLib/FancyZonesLib.vcxproj @@ -43,6 +43,7 @@ + diff --git a/src/modules/fancyzones/FancyZonesLib/FancyZonesLib.vcxproj.filters b/src/modules/fancyzones/FancyZonesLib/FancyZonesLib.vcxproj.filters index f20dfc7e33..b7680905b7 100644 --- a/src/modules/fancyzones/FancyZonesLib/FancyZonesLib.vcxproj.filters +++ b/src/modules/fancyzones/FancyZonesLib/FancyZonesLib.vcxproj.filters @@ -129,6 +129,9 @@ Header Files + + Header Files + diff --git a/src/modules/fancyzones/FancyZonesLib/FancyZonesWindowProcessing.h b/src/modules/fancyzones/FancyZonesLib/FancyZonesWindowProcessing.h new file mode 100644 index 0000000000..fcb434868e --- /dev/null +++ b/src/modules/fancyzones/FancyZonesLib/FancyZonesWindowProcessing.h @@ -0,0 +1,34 @@ +#pragma once + +#include +#include + +namespace FancyZonesWindowProcessing +{ + inline bool IsProcessable(HWND window) noexcept + { + const bool isSplashScreen = FancyZonesWindowUtils::IsSplashScreen(window); + if (isSplashScreen) + { + return false; + } + + const bool windowMinimized = IsIconic(window); + if (windowMinimized) + { + return false; + } + + // Switch between virtual desktops results with posting same windows messages that also indicate + // creation of new window. We need to check if window being processed is on currently active desktop. + // For windows that FancyZones shouldn't process (start menu, tray, popup menus) + // VirtualDesktopManager is unable to retrieve virtual desktop id and returns an error. + auto desktopId = VirtualDesktop::instance().GetDesktopId(window); + if (!desktopId.has_value() || (desktopId.has_value() && *desktopId != VirtualDesktop::instance().GetCurrentVirtualDesktopId())) + { + return false; + } + + return true; + } +} \ No newline at end of file diff --git a/src/modules/fancyzones/FancyZonesLib/VirtualDesktop.cpp b/src/modules/fancyzones/FancyZonesLib/VirtualDesktop.cpp index e0d12a614f..69a681a550 100644 --- a/src/modules/fancyzones/FancyZonesLib/VirtualDesktop.cpp +++ b/src/modules/fancyzones/FancyZonesLib/VirtualDesktop.cpp @@ -201,7 +201,7 @@ std::optional VirtualDesktop::GetDesktopId(HWND window) const if (m_vdManager && m_vdManager->IsWindowOnCurrentVirtualDesktop(window, &isWindowOnCurrentDesktop) == S_OK && isWindowOnCurrentDesktop) { // Filter windows such as Windows Start Menu, Task Switcher, etc. - if (m_vdManager->GetWindowDesktopId(window, &id) == S_OK && id != GUID_NULL) + if (m_vdManager->GetWindowDesktopId(window, &id) == S_OK) { return id; } diff --git a/src/modules/fancyzones/FancyZonesLib/WindowMoveHandler.cpp b/src/modules/fancyzones/FancyZonesLib/WindowMoveHandler.cpp index 9d54b58a93..862baeeb60 100644 --- a/src/modules/fancyzones/FancyZonesLib/WindowMoveHandler.cpp +++ b/src/modules/fancyzones/FancyZonesLib/WindowMoveHandler.cpp @@ -10,6 +10,7 @@ #include "FancyZonesData/AppZoneHistory.h" #include "Settings.h" #include "WorkArea.h" +#include #include // Non-Localizable strings @@ -60,6 +61,11 @@ WindowMoveHandler::WindowMoveHandler(const std::function& keyUpdateCallb void WindowMoveHandler::MoveSizeStart(HWND window, HMONITOR monitor, POINT const& ptScreen, const std::unordered_map>& workAreaMap) noexcept { + if (!FancyZonesWindowProcessing::IsProcessable(window)) + { + return; + } + if (!FancyZonesWindowUtils::IsCandidateForZoning(window) || WindowMoveHandlerUtils::IsCursorTypeIndicatingSizeEvent()) { return;