2016-10-22 26 views
0

Win32から最大化されたウィンドウを(EnumWindowsを使用して)検索する必要がありますが、現在の仮想デスクトップ上にあるウィンドウをフィルタしたい場合もあります。 MSDNではIVirtualDesktopManager interfaceに関するページが見つかりましたが、このインターフェイスの使用方法に関する情報はないようです。C++/Win32でIVirtualDesktopManagerインターフェイスを使用する方法

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インタフェースを使用してソリューションを唯一発見しました。

答えて

4

IVirtualDesktopManagerは、COMインターフェイスです。インターフェイスを実装するCOMオブジェクトをインスタンス化する必要があります。

this blogからのコードに基づいて、あなたは(IVirtualDesktopManagerが持っているよりもはるかに多くの機能を有し、かつIVirtualDesktopManagerInternalIVirtualDesktopManagerにアクセスするためにIServiceProviderを使用することができますが、例えば:答えのためのリンクのための

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

感謝。私はこれに関する質問を持っています、彼らはどのようにインターフェイスがどのように見えるのを見つけるために管理しましたか?レジストリに移動してIVirtualDesktopManagerInternalsを見つけました。そのGUIDも見つかりました。しかし、私はまだインタフェースについてのより多くの情報を見つけることはできませんでした。 –

+0

'IVirtualDesktopManager'はMSDNで文書化されています。そのブログで言及されている他のインターフェースは、サードパーティーのソース、リバースエンジニアリングなどを通じて決定された可能性があります。 –

+0

他のインターフェースについてはっきりと話していました。彼がどのようにそれをしたのかについてのより多くの情報を著者から得てうれしい。たぶん私は彼に連絡してください。 –

関連する問題