Files
PowerToys/src/modules/fancyzones/lib/VirtualDesktopUtils.cpp
vldmr11080 5ac7eddd03 Compare window desktop id with currently active work area desktop id. (#2110)
* 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.
2020-04-21 19:57:21 +02:00

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));
}
}