2016-10-22 2 views
0

Je dois rechercher des fenêtres agrandies à partir de Win32 (en utilisant EnumWindows) mais je veux aussi filtrer les fenêtres qui se trouvent sur le bureau virtuel actuel. Sur MSDN, j'ai trouvé une page sur le IVirtualDesktopManager interface mais il semble n'y avoir aucune information sur la façon d'utiliser cette interface.Comment utiliser l'interface IVirtualDesktopManager en C++/Win32

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

Lancers l'erreur suivante:

Non static member reference must be relative to a specific object

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

Lancers cette erreur:

Incomplete type is not allowed

Je n'ai trouvé des solutions sur l'utilisation de l'interface IVirtualDesktopManager en C# encore.

Répondre

4

IVirtualDesktopManager est une interface COM. Vous devez instancier l'objet COM qui implémente l'interface.

Basé sur le code de this blog, vous pouvez utiliser IServiceProvider pour accéder IVirtualDesktopManager (et IVirtualDesktopManagerInternal, qui a beaucoup plus de fonctionnalités que IVirtualDesktopManager a), par exemple:

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(); 
} 
+0

Merci pour la réponse et pour le lien. J'ai une question à ce sujet, comment ont-ils réussi à trouver comment l'interface ressemble? J'ai trouvé IVirtualDesktopManagerInternals en allant dans le registre, donc, j'ai également trouvé son GUID. Cependant, je n'ai pas encore réussi à trouver plus d'informations sur l'interface. –

+0

'IVirtualDesktopManager' est documenté sur MSDN. Les autres interfaces mentionnées dans ce blog étaient probablement déterminées par des sources tierces, l'ingénierie inverse, etc. –

+0

Oui, bien sûr, je parlais évidemment des autres interfaces. Ce serait bien d'avoir plus d'informations de l'auteur sur la façon dont il l'a fait. Peut-être que je devrais juste le contacter. –