IApplicationDesignModeSettings
COM公式ドキュメント
開発ツールアプリケーションが、ネイティブディスプレイ解像度、デバイススケールファクター、アプリケーションビュー状態といったシステムおよびユーザーの状態を動的に偽装(スプーフ)できるようにします。これにより、実際のハードウェアを用意することなく、さまざまなフォームファクターに対してデザインモードで動作する Windows ストアアプリをテストできます。また、通常はユーザーが制御する状態の変化を偽装することで、さまざまなシナリオ下で Windows ストアアプリをテストすることも可能にします。
解説(Remarks)
このインターフェイスは、CLSID_ApplicationDesignModeSettings をコクリエイト(cocreate)することで取得します。
ユーザーは通常、次のような使用パターンに従います:
- Windows ストアアプリのプロセス内のスレッドで、CLSID_ApplicationDesignModeSettings を指定して CoCreateInstance を呼び出し、アプリケーションデザインモード設定オブジェクトを作成します。
- アプリケーションデザインモード設定オブジェクトで QueryInterface を呼び出し、IInitializeWithWindow オブジェクトを取得します。
- IInitializeWithWindow オブジェクトの Initialize メソッドを、プロキシコアウィンドウの HWND を渡して呼び出します。これは「set」系メソッドを呼び出す前に行う必要があり、プロセスごとに一度だけ成功します。コード例については、[CoreWindow に依存する WinRT UI オブジェクトを表示する](/windows/apps/develop/ui-input/display-ui-objects#winui-3-with-c) を参照してください。
- IApplicationDesignModeSettings に対して QueryInterface を呼び出し、適切なメソッド(SetNativeDisplaySize、SetScaleFactor など)を呼び出して、必要なテスト状態を偽装します。これらのメソッドは、Windows ストアアプリに対して適切な Windows ランタイムイベントを発生させます。
- ComputeApplicationSize メソッドを呼び出して、現在偽装されている状態に基づき、アプリに適切なサイズを求めます。すべてのレイアウト「set」系メソッドは事前に呼び出されている必要があり、そうでない場合この呼び出しは失敗します。アプリウィンドウの配置とサイズ設定は、必要に応じて開発ツールアプリケーションが行う責任があります。
実装するタイミング
このインターフェイスを実装しないでください。実装は Windows によって提供されます。使用するタイミング
このインターフェイスのメソッドを使用して、さまざまな偽装された構成やシナリオの下で Windows ストアアプリをテストします。例
この例では、このインターフェイスのメソッドの使用方法を示します。
IApplicationDesignModeSettings *pDesignModeSettings;
// CoCreate the design mode settings object
HRESULT hr = CoCreateInstance(CLSID_ApplicationDesignModeSettings, nullptr, CLSCTX_INPROC, IID_PPV_ARGS(&pDesignModeSettings));
if (SUCCEEDED(hr))
{
IInitializeWithWindow *pInitializeWithWindow;
hr = pDesignModeSettings->QueryInterface(IID_PPV_ARGS(&pInitializeWithWindow);
if (SUCCEEDED(hr))
{
// Before we spoof any state, we must first initialize the design
// mode settings object with a proxy core window. Since apps
// running in design mode don't have an actual core window, we must
// supply an HWND that can be used as a proxy.
hr = pInitializeWithWindow->Initialize(hwndProxyCoreWindow);
pInitializeWithWindow->Release();
}
if (SUCCEEDED(hr))
{
// Verify that our desired spoofed settings are supported.
SIZE sizeNativeDisplay = {1366, 768};
SCALE_FACTOR scaleFactor = SCALE_100_PERCENT;
APPLICATION_VIEW_STATE viewState = AVS_FULLSCREEN_LANDSCAPE;
BOOL fSupported;
hr = pDesignModeSettings->IsApplicationViewStateSupported(viewState,
sizeNativeDisplay,
scaleFactor,
&fSupported);
}
if (SUCCEEDED(hr) && fSupported))
{
// Set the spoofed native display size.
hr = pDesignModeSettings->SetNativeDisplaySize(sizeNativeDisplay);
if (SUCCEEDED(hr))
{
// Set the spoofed scale factor to 100%.
hr = pDesignModeSettings->SetScaleFactor(SCALE_100_PERCENT);
}
if (SUCCEEDED(hr))
{
// Set the spoofed application view state to full-screen landscape.
hr = pDesignModeSettings->SetApplicationViewState(AVS_FULLSCREEN_LANDSCAPE);
}
if (SUCCEEDED(hr))
{
// Now that all the necessary state has been spoofed, calculate
// the size that the app should occupy.
SIZE sizeApplication;
hr = pDesignModeSettings->ComputeApplicationSize(&sizeApplication);
}
}
pDesignModeSettings->Release();
}
メソッド 6
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
デザインモードで動作する Windows ストアアプリに使用する、偽装されたネイティブディスプレイサイズを設定します。
| nativeDisplaySizePixels | SIZE | in | 偽装するディスプレイのネイティブサイズを SIZE 構造体で指定します。指定したサイズは横向き(ランドスケープ)方向に正規化されます。向きを偽装するには、SetApplicationViewState を参照してください。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は、次を含む HRESULT エラーコードを返します:
| 戻り値のコード | 説明 |
|---|---|
|
プロキシコアウィンドウを設定するための IInitializeWithWindow::Initialize が呼び出されていません。 |
| 解像度がこの値まで低い場合、イマーシブアプリを起動したり切り替えたりすることはできません。これは現在、横向き方向で水平 800 ピクセルまたは垂直 600 ピクセルを下回る解像度として定義されています。 |
デザインモードで動作する Windows ストアアプリに使用する、偽装されたデバイススケールファクターを設定します。
| scaleFactor | DEVICE_SCALE_FACTOR | in | 偽装するデバイススケールファクターを示す DEVICE_SCALE_FACTOR 列挙値のいずれか。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は、次を含む HRESULT エラーコードを返します:
| 戻り値のコード | 説明 |
|---|---|
|
プロキシコアウィンドウを設定するための IInitializeWithWindow::Initialize が呼び出されていません。 |
デザインモードで動作する Windows ストアアプリに使用する、偽装されたアプリケーションビュー状態(全画面ランドスケープ、全画面ポートレート、フィル、またはスナップ)を設定します。
| viewState | APPLICATION_VIEW_STATE | in | 偽装するアプリケーションビュー状態を示す APPLICATION_VIEW_STATE 列挙値のいずれか。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は、次を含む HRESULT エラーコードを返します:
| 戻り値のコード | 説明 |
|---|---|
|
プロキシコアウィンドウを設定するための IInitializeWithWindow::Initialize が呼び出されていません。 |
現在の偽装設定のセットに基づいて、Windows ストアアプリのサイズを取得します。
| applicationSizePixels | SIZE* | out | このメソッドが正常に返ると、現在の偽装設定のセットに基づいて Windows ストアアプリが占めるべきサイズへのポインターを受け取ります。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は、次を含む HRESULT エラーコードを返します:
| 戻り値のコード | 説明 |
|---|---|
|
プロキシコアウィンドウを設定するための IInitializeWithWindow::Initialize が呼び出されていません。 |
特定の偽装されたディスプレイサイズおよびスケールファクター設定に対して、特定のアプリケーションビュー状態がサポートされているかどうかを判定します。
| viewState | APPLICATION_VIEW_STATE | in | サポートの有無を判定するアプリケーションビュー状態を示す列挙値のいずれか。 |
| nativeDisplaySizePixels | SIZE | in | 偽装するディスプレイのネイティブサイズ。 |
| scaleFactor | DEVICE_SCALE_FACTOR | in | 偽装するデバイススケールファクターを示す列挙値のいずれか。 |
| supported | BOOL* | out | このメソッドが正常に返ると、Boolean 値へのポインターを受け取ります。指定されたディスプレイサイズとスケールファクターに対してアプリケーションビュー状態がサポートされている場合は TRUE、サポートされていない場合は FALSE に設定されます。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は、次を含む HRESULT エラーコードを返します:
| 戻り値のコード | 説明 |
|---|---|
|
プロキシコアウィンドウを設定するための IInitializeWithWindow::Initialize が呼び出されていません。 |
偽装されたエッジジェスチャイベントを、呼び出し元スレッドのプロキシコアウィンドウに送信します。このジェスチャは、アプリがアプリバーをサポートしている場合、そのアプリバーの表示を切り替えます。呼び出し元は、エッジジェスチャをトリガーした入力の種類を指定できます。
| edgeGestureKind | EDGE_GESTURE_KIND | in | 偽装されたエッジジェスチャを生成した EDGE_GESTURE_KIND 入力タイプを示します。タッチ(EGK_TOUCH)を指定した場合、Starting と Completed の両方のエッジジェスチャイベントが送信されます。それ以外の場合は、Completed イベントのみが送信されます。次のいずれかの値: EGK_TOUCH (0)エッジジェスチャイベントは、タッチ対応画面上のスワイプによって生成されました。 EGK_KEYBOARD (1)エッジジェスチャイベントは、キーボードの Win+Z キーシーケンスによって生成されました。 EGK_MOUSE (2)エッジジェスチャイベントは、マウスの右クリックによって生成されました。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は、次を含む HRESULT エラーコードを返します:
| 戻り値のコード | 説明 |
|---|---|
|
プロキシコアウィンドウを設定するための IInitializeWithWindow::Initialize が呼び出されていません。 |
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IApplicationDesignModeSettings "{2A3DEE9A-E31D-46D6-8508-BCC597DB3557}" #usecom global IApplicationDesignModeSettings IID_IApplicationDesignModeSettings "{958A6FB5-DCB2-4FAF-AAFD-7FB054AD1A3B}" #comfunc global IApplicationDesignModeSettings_SetNativeDisplaySize 3 int #comfunc global IApplicationDesignModeSettings_SetScaleFactor 4 int #comfunc global IApplicationDesignModeSettings_SetApplicationViewState 5 int #comfunc global IApplicationDesignModeSettings_ComputeApplicationSize 6 var #comfunc global IApplicationDesignModeSettings_IsApplicationViewStateSupported 7 int,int,int,var #comfunc global IApplicationDesignModeSettings_TriggerEdgeGesture 8 int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IApplicationDesignModeSettings "{2A3DEE9A-E31D-46D6-8508-BCC597DB3557}" #usecom global IApplicationDesignModeSettings IID_IApplicationDesignModeSettings "{958A6FB5-DCB2-4FAF-AAFD-7FB054AD1A3B}" #comfunc global IApplicationDesignModeSettings_SetNativeDisplaySize 3 int #comfunc global IApplicationDesignModeSettings_SetScaleFactor 4 int #comfunc global IApplicationDesignModeSettings_SetApplicationViewState 5 int #comfunc global IApplicationDesignModeSettings_ComputeApplicationSize 6 sptr #comfunc global IApplicationDesignModeSettings_IsApplicationViewStateSupported 7 int,int,int,sptr #comfunc global IApplicationDesignModeSettings_TriggerEdgeGesture 8 int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。