IVirtualDesktopManager
COM公式ドキュメント
アプリケーションが仮想ワークスペースを構成するウィンドウのグループと連携できるようにするメソッドを公開します。
解説(Remarks)
ユーザーは複数のウィンドウをまとめて仮想デスクトップを作成できます。すべてのウィンドウは、いずれかの仮想デスクトップに属していると見なされます。ある仮想デスクトップが非表示になると、それに関連付けられたすべてのウィンドウも非表示になります。これにより、ユーザーは複数の作業環境を作成し、それらを切り替えられるようになります。同様に、ある仮想デスクトップがアクティブとして選択されると、その仮想デスクトップに関連付けられたウィンドウが画面に表示されます。
この概念をサポートするため、アプリケーションはユーザーをある仮想デスクトップから別の仮想デスクトップへ自動的に切り替えることは避けるべきです。その変更を行えるのはユーザーのみであるべきです。これをサポートするため、新しく作成されたウィンドウは現在アクティブな仮想デスクトップ上に表示されるべきです。さらに、アプリケーションが現在アクティブなウィンドウを再利用できる場合は、そのウィンドウが現在アクティブな仮想デスクトップ上にある場合にのみ再利用すべきです。そうでない場合は、新しいウィンドウを作成すべきです。
上の図では、ユーザーは 2 つの仮想デスクトップを持っており、現在アクティブな仮想デスクトップは VD2 です。ユーザーが Outlook のメッセージ内のリンクをクリックすると、URI のアクティブ化が発生し、そのリンクを Internet Explorer のウィンドウで開くべきです。ユーザーが IE でリンクを現在のウィンドウで開くように構成している場合、通常は現在開いているウィンドウが使用されます。しかしこの場合、IE は非アクティブな仮想デスクトップ上にあります。このシナリオでは、IE は現在アクティブな仮想デスクトップ上に新しいウィンドウを作成すべきです。メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
指定したウィンドウが現在アクティブな仮想デスクトップ上にあるかどうかを示します。
| topLevelWindow | HWND | in | 対象のウィンドウ。 |
| onCurrentDesktop | BOOL* | out | topLevelWindow が現在アクティブな仮想デスクトップ上にある場合は True、それ以外の場合は false。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
指定したトップレベルウィンドウをホストしている仮想デスクトップの識別子を取得します。
| topLevelWindow | HWND | in | 対象とする仮想デスクトップのトップレベルウィンドウ。 |
| desktopId | GUID* | out | topLevelWindow をホストしている仮想デスクトップの識別子。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
ウィンドウを指定した仮想デスクトップに移動します。
| topLevelWindow | HWND | in | 移動するウィンドウ。 |
| desktopId | GUID* | in | 移動先の仮想デスクトップの識別子。ウィンドウの識別子を取得するには GetWindowDesktopId を使用します。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IVirtualDesktopManager "{A5CD92FF-29BE-454C-8D04-D82879FB3F1B}" #usecom global IVirtualDesktopManager IID_IVirtualDesktopManager "{AA509086-5CA9-4C25-8F95-589D3C07B48A}" #comfunc global IVirtualDesktopManager_IsWindowOnCurrentVirtualDesktop 3 sptr,var #comfunc global IVirtualDesktopManager_GetWindowDesktopId 4 sptr,var #comfunc global IVirtualDesktopManager_MoveWindowToDesktop 5 sptr,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IVirtualDesktopManager "{A5CD92FF-29BE-454C-8D04-D82879FB3F1B}" #usecom global IVirtualDesktopManager IID_IVirtualDesktopManager "{AA509086-5CA9-4C25-8F95-589D3C07B48A}" #comfunc global IVirtualDesktopManager_IsWindowOnCurrentVirtualDesktop 3 sptr,sptr #comfunc global IVirtualDesktopManager_GetWindowDesktopId 4 sptr,sptr #comfunc global IVirtualDesktopManager_MoveWindowToDesktop 5 sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。