/ src / modules / alwaysontop / AlwaysOnTop / VirtualDesktopUtils.cpp
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  }