Мне нужно искать развернутые окна из Win32 (с помощью EnumWindows
) но я также хочу отфильтровать окна, которые находятся на текущем виртуальном рабочем столе. На MSDN я нашел страницу о IVirtualDesktopManager
интерфейс но, похоже, нет информации о том, как использовать этот интерфейс.
IVirtualDesktopManager::IsWindowOnCurrentVirtualDesktop(/*args...*/);
Выдает следующую ошибку:
Нестатическая ссылка на член должна относиться к определенному объекту
VirtualDesktopManager mVirtualDeskManager;
mVirtualDesktopManager.IsWindowOnCurrentVirtualDesktop(/args...*/)
Выдает эту ошибку:
Неполный тип не допускается
Я нашел только решения по использованию IVirtualDesktopManager
Интерфейса в C # пока нет.
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();
}
Других решений пока нет …