CoAllowSetForegroundWindow 関数 (objbase.h)
この関数は、フォアグラウンド特権 (フォアグラウンド ウィンドウを設定する特権) をあるプロセスから別のプロセスに渡します。 フォアグラウンド特権を持つプロセスは、この関数を呼び出して、その特権をローカル COM サーバー プロセスに渡すことができます。 CoAllowSetForegroundWindow を呼び出すと、特権のみが付与されることに注意してください。フォアグラウンド ウィンドウ自体は設定されません。 フォアグラウンドとフォーカスは、ターゲット COM サーバーが SetForegroundWindow または間接的に呼び出す別の API を呼び出す場合にのみ、クライアント アプリケーションから削除されます。
構文
HRESULT CoAllowSetForegroundWindow(
[in] IUnknown *pUnk,
[in] LPVOID lpvReserved
);
パラメーター
[in] pUnk
ターゲット COM サーバーのプロキシ上の IUnknown インターフェイスへのポインター。
[in] lpvReserved
このパラメーターは予約済みであり、 NULL である必要があります。
戻り値
この関数は、次の値を返すことができます。
リターン コード | 説明 |
---|---|
|
メソッドは正常に実行されました。 |
|
lpvReserved パラメーターが NULL ではありません。 |
|
pUnk パラメーターは、フォアグラウンド ウィンドウ コントロールをサポートしていません。 |
|
呼び出し元のプロセスは現在、フォアグラウンド特権を持っていません。 |
注釈
システムは、 SetForegroundWindow 関数と AllowSetForegroundWindow 関数を呼び出してフォアグラウンド ウィンドウを設定できるプロセスを制限します。 その結果、ユーザーが操作している場合でも、アプリケーションは別のアプリケーションからフォーカスを盗むのをブロックされます。 CoAllowSetForegroundWindow を使用して、それを持つプロセスから、まだ持っていないプロセスにフォアグラウンド特権を渡します。 これは推移的に行うことができます。あるプロセスから別のプロセスに特権を渡してから、別のプロセスに特権を渡すなどです。
CoAllowSetForegroundWindow を使用すると、カスタム インターフェイスを持つユーザーは、ウィンドウの変更が必要な OLE インターフェイス (主にリンクと埋め込みに関連) で発生するのと同じ動作を取得できます。
バックグラウンドでは、 IForegroundTransfer インターフェイスを使用して、プロセス間のフォアグラウンド ウィンドウが生成されます。 標準の COM が提供するプロキシでは既に IForegroundTransfer が実装されているため、標準プロキシを使用している場合は、追加の作業を行う必要はありません。 CoAllowSetForegroundWindow を呼び出して、フォアグラウンド特権をプロセス外の COM オブジェクトに転送するだけです。
例
次の例では、クライアント プロセスがローカル COM サーバーを作成し、 CoAllowSetForegroundWindow を呼び出してフォアグラウンド特権を転送し、次に SetForegroundWindow を直接または間接的に呼び出す COM サーバーで関数を呼び出す方法を示します。
Microsoft::WRL::ComPtr<IExampleInterface> exampleLocalServer;
ThrowIfFailed(::CoCreateInstance(CLSID_ExampleLocalServer,
nullptr, CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&exampleLocalServer)));
// You can adapt to success or failure, but don't automatically throw. Don’t make the
// opening of a window dependent on successfully passing privilege (and taking foreground),
// because the window will signal to the user that it is ready to take focus.
HRESULT hr = ::CoAllowSetForegroundWindow(exampleLocalServer.Get(), nullptr);
// Call an example method that itself calls ::SetForegroundWindow(HWND).
hr = exampleLocalServer->FunctionThatSetsForegroundWindow();
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 2000 Professional [デスクトップ アプリのみ] |
サポートされている最小のサーバー | Windows 2000 Server [デスクトップ アプリのみ] |
対象プラットフォーム | Windows |
ヘッダー | objbase.h |
Library | Ole32.lib |
[DLL] | Ole32.dll |
API セット | ext-ms-win-com-ole32-l1-1-1 (Windows 8.1で導入) |