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

Jan*_*öhm 1 c++ winapi virtual-desktop windows-10-desktop

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

IVirtualDesktopManager::IsWindowOnCurrentVirtualDesktop(/*args...*/);
Run Code Online (Sandbox Code Playgroud)

引发以下错误:

非静态成员引用必须相对于特定对象

VirtualDesktopManager mVirtualDeskManager;
mVirtualDesktopManager.IsWindowOnCurrentVirtualDesktop(/args...*/)
Run Code Online (Sandbox Code Playgroud)

抛出此错误:

不允许使用不完整的类型

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

Rem*_*eau 6

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

基于此博客的代码,您可以使用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();
}
Run Code Online (Sandbox Code Playgroud)