mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-12-16 11:48:06 +01:00
* Compare window desktop id with currently active work area desktop id. * Improve error handling and conform to coding guidelines. * Move virtual desktop helper functions to ZoneWindowUtils namespace. * Ensure thread safety when creating instance of VirtualDesktopManager. * Remove static qualifier from ServiceProvider. * Return instead of break, as there is no need to check for other monitors, virtual desktop is the same for all. * Move virtual desktop related helper functions to separate files. * Skip comparing desktop ids if zone window has empty GUID for desktop id. * Add comment describion scenario for which we need this fix.
50 lines
1.7 KiB
C++
50 lines
1.7 KiB
C++
#include "pch.h"
|
|
|
|
#include "VirtualDesktopUtils.h"
|
|
|
|
namespace VirtualDesktopUtils
|
|
{
|
|
const CLSID CLSID_ImmersiveShell = { 0xC2F03A33, 0x21F5, 0x47FA, 0xB4, 0xBB, 0x15, 0x63, 0x62, 0xA2, 0xF2, 0x39 };
|
|
const wchar_t GUID_EmptyGUID[] = L"{00000000-0000-0000-0000-000000000000}";
|
|
|
|
IServiceProvider* GetServiceProvider()
|
|
{
|
|
IServiceProvider* provider{ nullptr };
|
|
if (FAILED(CoCreateInstance(CLSID_ImmersiveShell, nullptr, CLSCTX_LOCAL_SERVER, __uuidof(provider), (PVOID*)&provider)))
|
|
{
|
|
return nullptr;
|
|
}
|
|
return provider;
|
|
}
|
|
|
|
IVirtualDesktopManager* GetVirtualDesktopManager()
|
|
{
|
|
IVirtualDesktopManager* manager{ nullptr };
|
|
IServiceProvider* serviceProvider = GetServiceProvider();
|
|
if (serviceProvider == nullptr || FAILED(serviceProvider->QueryService(__uuidof(manager), &manager)))
|
|
{
|
|
return nullptr;
|
|
}
|
|
return manager;
|
|
}
|
|
|
|
bool GetWindowDesktopId(HWND topLevelWindow, GUID* desktopId)
|
|
{
|
|
static IVirtualDesktopManager* virtualDesktopManager = GetVirtualDesktopManager();
|
|
return (virtualDesktopManager != nullptr) &&
|
|
SUCCEEDED(virtualDesktopManager->GetWindowDesktopId(topLevelWindow, desktopId));
|
|
}
|
|
|
|
bool GetZoneWindowDesktopId(IZoneWindow* zoneWindow, GUID* desktopId)
|
|
{
|
|
// Format: <device-id>_<resolution>_<virtual-desktop-id>
|
|
std::wstring uniqueId = zoneWindow->UniqueId();
|
|
std::wstring virtualDesktopId = uniqueId.substr(uniqueId.rfind('_') + 1);
|
|
if (virtualDesktopId == GUID_EmptyGUID)
|
|
{
|
|
return false;
|
|
}
|
|
return SUCCEEDED(CLSIDFromString(virtualDesktopId.c_str(), desktopId));
|
|
}
|
|
}
|