CoAllowSetForegroundWindow 関数 (objbase.h)

この関数は、フォアグラウンド特権 (フォアグラウンド ウィンドウを設定する特権) をあるプロセスから別のプロセスに渡します。 フォアグラウンド特権を持つプロセスは、この関数を呼び出して、その特権をローカル COM サーバー プロセスに渡すことができます。 CoAllowSetForegroundWindow を呼び出すと、特権のみが付与されることに注意してください。フォアグラウンド ウィンドウ自体は設定されません。 フォアグラウンドとフォーカスは、ターゲット COM サーバーが SetForegroundWindow または間接的に呼び出す別の API を呼び出す場合にのみ、クライアント アプリケーションから削除されます。

構文

HRESULT CoAllowSetForegroundWindow(
  [in] IUnknown *pUnk,
  [in] LPVOID   lpvReserved
);

パラメーター

[in] pUnk

ターゲット COM サーバーのプロキシ上の IUnknown インターフェイスへのポインター。

[in] lpvReserved

このパラメーターは予約済みであり、 NULL である必要があります。

戻り値

この関数は、次の値を返すことができます。

リターン コード 説明
S_OK
メソッドは正常に実行されました。
E_INVALIDARG
lpvReserved パラメーターが NULL ではありません。
E_NOINTERFACE
pUnk パラメーターは、フォアグラウンド ウィンドウ コントロールをサポートしていません。
E_ACCESSDENIED
呼び出し元のプロセスは現在、フォアグラウンド特権を持っていません。

注釈

システムは、 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で導入)

こちらもご覧ください

IForegroundTransfer