如何在C++/Win32中使用IVirtualDesktopManager接口

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

我需要从 Win32 中搜索最大化的 windows(通过使用 EnumWindows),但我还想过滤当前虚拟桌面上的 windows。在 MSDN 上,我找到了一个关于 IVirtualDesktopManager interface 的页面,但是似乎没有关于如何使用这个界面的信息。

IVirtualDesktopManager::IsWindowOnCurrentVirtualDesktop(/*args...*/);

抛出以下错误:

Non static member reference must be relative to a specific object

VirtualDesktopManager mVirtualDeskManager;
mVirtualDesktopManager.IsWindowOnCurrentVirtualDesktop(/args...*/)

引发此错误:

Incomplete type is not allowed

我只找到了在 C# 中使用 IVirtualDesktopManager 接口的解决方案。

IVirtualDesktopManager是COM接口。您需要实例化实现该接口的COM对象。

基于 this blog 中的代码,您可以使用 IServiceProvider 访问 IVirtualDesktopManager(和 IVirtualDesktopManagerInternal,它的功能比 IVirtualDesktopManager 多得多), 例如:

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