#pragma once #include "WorkArea.h" #include "on_thread_executor.h" class VirtualDesktop { public: VirtualDesktop(const std::function& vdInitCallback, const std::function& vdUpdatedCallback); ~VirtualDesktop(); inline bool IsVirtualDesktopIdSavedInRegistry(GUID id) const { auto ids = GetVirtualDesktopIdsFromRegistry(); if (!ids.has_value()) { return false; } for (const auto& regId : *ids) { if (regId == id) { return true; } } return false; } void Init(); void UnInit(); std::optional GetCurrentVirtualDesktopIdFromRegistry() const; std::optional> GetVirtualDesktopIdsFromRegistry() const; bool IsWindowOnCurrentDesktop(HWND window) const; std::optional GetDesktopId(HWND window) const; std::optional GetDesktopIdByTopLevelWindows() const; std::vector> GetWindowsRelatedToDesktops() const; private: std::function m_vdInitCallback; std::function m_vdUpdatedCallback; IVirtualDesktopManager* m_vdManager; OnThreadExecutor m_virtualDesktopTrackerThread; wil::unique_handle m_terminateVirtualDesktopTrackerEvent; std::optional> GetVirtualDesktopIdsFromRegistry(HKEY hKey) const; void HandleVirtualDesktopUpdates(); };