2

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

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

引发以下错误:

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

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

引发此错误:

不允许不完整的类型

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

4

1 回答 1

7

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();
}
于 2016-10-22T21:19:12.373 回答