#c #winapi #windows-10-desktop #virtual-desktop
#c #winapi #windows-10-рабочий стол #виртуальный рабочий стол
Вопрос:
Мне нужно выполнить поиск развернутых окон в Win32 (с помощью EnumWindows
), но я также хочу отфильтровать окна, которые находятся на текущем виртуальном рабочем столе. В MSDN я нашел страницу об IVirtualDesktopManager
интерфейсе, но, похоже, там нет информации о том, как использовать этот интерфейс.
IVirtualDesktopManager::IsWindowOnCurrentVirtualDesktop(/*args...*/);
Выдает следующую ошибку:
Нестатическая ссылка на элемент должна относиться к определенному объекту
VirtualDesktopManager mVirtualDeskManager;
mVirtualDesktopManager.IsWindowOnCurrentVirtualDesktop(/args...*/)
Выдает эту ошибку:
Неполный тип недопустим
Я пока нашел решения только по использованию IVirtualDesktopManager
интерфейса в C #.
Ответ №1:
IVirtualDesktopManager
является COM-интерфейсом. Вам необходимо создать экземпляр COM-объекта, который реализует интерфейс.
Основываясь на коде из этого блога, вы можете использовать IServiceProvider
для доступа IVirtualDesktopManager
(и IVirtualDesktopManagerInternal
, который обладает гораздо большей функциональностью, чем IVirtualDesktopManager
имеет), например:
IServiceProvider* pServiceProvider = NULL;
HRESULT hr = ::CoCreateInstance(
CLSID_ImmersiveShell, NULL, CLSCTX_LOCAL_SERVER,
__uuidof(IServiceProvider), (PVOID*)amp;pServiceProvider);
if (SUCCEEDED(hr))
{
IVirtualDesktopManager *pDesktopManager = NULL;
hr = pServiceProvider->QueryService(__uuidof(IVirtualDesktopManager), amp;pDesktopManager);
if (SUCCEEDED(hr))
{
BOOL bIsOnCurrentDesktop = FALSE;
hr = pDesktopManager->IsWindowOnCurrentVirtualDesktop(hWnd, amp;bIsOnCurrentDesktop);
if (SUCCEEDED(hr))
{
// use bIsOnCurrentDesktop as needed...
}
pDesktopManager->Release();
}
pServiceProvider->Release();
}
Комментарии:
1. Спасибо за ответ и за ссылку. У меня вопрос по этому поводу, как им удалось выяснить, как выглядит интерфейс? Я нашел IVirtualDesktopManagerInternals, зайдя в реестр, поэтому я также нашел его GUID. Однако мне пока не удалось найти больше информации об интерфейсе.
2.
IVirtualDesktopManager
задокументирован на MSDN. Другие интерфейсы, упомянутые в этом блоге, вероятно, были определены с помощью сторонних источников, обратного проектирования и т.д.3. Да, конечно, я, очевидно, говорил о других интерфейсах. Было бы неплохо получить от автора больше информации о том, как он это сделал. Возможно, мне следует просто связаться с ним.
4. Работает ли это (не тестировалось)? learn.microsoft.com/en-us/previous-versions/windows /… получает 3 аргумента.
5. Извините, я начал вводить комментарий, но почему-то отвлекся от страницы. Это действительно работает, поскольку форма с 2 аргументами является перегрузкой шаблона, которая вызывает форму с 3 аргументами. Это эквивалентно:
hr = pServiceProvider->QueryService(__uuidof(IVirtualDesktopManager), __uuidof(IVirtualDesktopManager), (void**)(amp;pDesktopManager));
(странно, поскольку один и тот же IID передается дважды).