次の方法で共有


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