如何在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();
}
我需要从 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();
}