VirtualDesktopUtils.cpp
1 #include "pch.h" 2 #include "VirtualDesktopUtils.h" 3 4 // Non-Localizable strings 5 namespace NonLocalizable 6 { 7 const wchar_t RegKeyVirtualDesktops[] = L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\VirtualDesktops"; 8 } 9 10 HKEY OpenVirtualDesktopsRegKey() 11 { 12 HKEY hKey{ nullptr }; 13 if (RegOpenKeyEx(HKEY_CURRENT_USER, NonLocalizable::RegKeyVirtualDesktops, 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS) 14 { 15 return hKey; 16 } 17 return nullptr; 18 } 19 20 HKEY GetVirtualDesktopsRegKey() 21 { 22 static wil::unique_hkey virtualDesktopsKey{ OpenVirtualDesktopsRegKey() }; 23 return virtualDesktopsKey.get(); 24 } 25 26 VirtualDesktopUtils::VirtualDesktopUtils() 27 { 28 auto res = CoCreateInstance(CLSID_VirtualDesktopManager, nullptr, CLSCTX_ALL, IID_PPV_ARGS(&m_vdManager)); 29 if (FAILED(res)) 30 { 31 Logger::error("Failed to create VirtualDesktopManager instance"); 32 } 33 } 34 35 VirtualDesktopUtils::~VirtualDesktopUtils() 36 { 37 if (m_vdManager) 38 { 39 m_vdManager->Release(); 40 } 41 } 42 43 bool VirtualDesktopUtils::IsWindowOnCurrentDesktop(HWND window) const 44 { 45 std::optional<GUID> id = GetDesktopId(window); 46 return id.has_value(); 47 } 48 49 std::optional<GUID> VirtualDesktopUtils::GetDesktopId(HWND window) const 50 { 51 GUID id; 52 BOOL isWindowOnCurrentDesktop = false; 53 if (m_vdManager && m_vdManager->IsWindowOnCurrentVirtualDesktop(window, &isWindowOnCurrentDesktop) == S_OK && isWindowOnCurrentDesktop) 54 { 55 // Filter windows such as Windows Start Menu, Task Switcher, etc. 56 if (m_vdManager->GetWindowDesktopId(window, &id) == S_OK && id != GUID_NULL) 57 { 58 return id; 59 } 60 } 61 62 return std::nullopt; 63 }