How to use the IVirtualDesktopManager interface in C++/Win32

c++, virtual-desktop, winapi, windows-10-desktop

Solution

`IVirtualDesktopManager` is a COM interface. You need to instantiate the COM object that implements the interface.

Based on code from this blog, you can use `IServiceProvider` to access `IVirtualDesktopManager` (and `IVirtualDesktopManagerInternal`, which has much more functionality than `IVirtualDesktopManager` has), eg:

IServiceProvider* pServiceProvider = NULL;
HRESULT hr = ::CoCreateInstance(
    CLSID_ImmersiveShell, NULL, CLSCTX_LOCAL_SERVER,
    __uuidof(IServiceProvider), (PVOID*)&pServiceProvider);

if (SUCCEEDED(hr))
{
    IVirtualDesktopManager *pDesktopManager = NULL;
    hr = pServiceProvider->QueryService(__uuidof(IVirtualDesktopManager), &pDesktopManager);

    if (SUCCEEDED(hr))
    {
        BOOL bIsOnCurrentDesktop = FALSE;
        hr = pDesktopManager->IsWindowOnCurrentVirtualDesktop(hWnd, &bIsOnCurrentDesktop);

        if (SUCCEEDED(hr))
        {
            // use bIsOnCurrentDesktop as needed...
        }

        pDesktopManager->Release();
    }

    pServiceProvider->Release();
}

Problem

I need to search for maximized windows from Win32 (by using `EnumWindows`) but I also want to filter for windows which are on the current virtual desktop. On MSDN, I found a page about the `IVirtualDesktopManager` interface but there seems to be no information on how to use this interface. ``` IVirtualDesktopManager::IsWindowOnCurrentVirtualDesktop(/*args...*/); ``` Throws the following error: Non static member reference must be relative to a specific object ``` VirtualDesktopManager mVirtualDeskManager; mVirtualDesktopManager.IsWindowOnCurrentVirtualDesktop(/args...*/) ``` Throws this error: Incomplete type is not allowed I have only found solutions on using the `IVirtualDesktopManager` interface in C# yet.

Original source