Как использовать интерфейс IVirtualDesktopManager в C / Win32

#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 передается дважды).