From 5679d4807367e7341a0ac8dd4758d762d302e6d8 Mon Sep 17 00:00:00 2001 From: Manuel Serra Date: Fri, 18 Jun 2021 16:53:23 +0200 Subject: [PATCH] Fix `CurrentVirtualDesktop` fetching from registry (#11760) * fix(#11125): fallback to canonical regkey session unaware * chore(#11125): use wil::unique_hkey instead of HKEY for fallback CurrentVirtualDesktop * refactor: extract new explorer current virtual desktop behavior into a separate method --- .../fancyzones/lib/VirtualDesktopUtils.cpp | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/modules/fancyzones/lib/VirtualDesktopUtils.cpp b/src/modules/fancyzones/lib/VirtualDesktopUtils.cpp index 50491529b6..136eaa0d61 100644 --- a/src/modules/fancyzones/lib/VirtualDesktopUtils.cpp +++ b/src/modules/fancyzones/lib/VirtualDesktopUtils.cpp @@ -51,6 +51,23 @@ namespace VirtualDesktopUtils return SUCCEEDED(CLSIDFromString(virtualDesktopId.c_str(), desktopId)); } + bool NewGetCurrentDesktopId(GUID* desktopId) + { + wil::unique_hkey key{}; + if (RegOpenKeyExW(HKEY_CURRENT_USER, NonLocalizable::RegKeyVirtualDesktops, 0, KEY_ALL_ACCESS, &key) == ERROR_SUCCESS) + { + GUID value{}; + DWORD size = sizeof(GUID); + if (RegQueryValueExW(key.get(), NonLocalizable::RegCurrentVirtualDesktop, 0, nullptr, reinterpret_cast(&value), &size) == ERROR_SUCCESS) + { + *desktopId = value; + return true; + } + } + + return false; + } + bool GetDesktopIdFromCurrentSession(GUID* desktopId) { DWORD sessionId; @@ -76,11 +93,19 @@ namespace VirtualDesktopUtils return true; } } + return false; } bool GetCurrentVirtualDesktopId(GUID* desktopId) { + // On newer Windows builds, the current virtual desktop is persisted to + // a totally different reg key. Look there first. + if (NewGetCurrentDesktopId(desktopId)) + { + return true; + } + // Explorer persists current virtual desktop identifier to registry on a per session basis, but only // after first virtual desktop switch happens. If the user hasn't switched virtual desktops in this // session, value in registry will be empty.