Función CoAllowSetForegroundWindow (objbase.h)

Esta función pasa el privilegio de primer plano (el privilegio para establecer la ventana de primer plano) de un proceso a otro. El proceso que tiene el privilegio de primer plano puede llamar a esta función para pasar ese privilegio a un proceso de servidor COM local. Tenga en cuenta que llamar a CoAllowSetForegroundWindow solo confiere el privilegio; no establece la propia ventana de primer plano. El primer plano y el foco solo se quitan de la aplicación cliente cuando el servidor COM de destino llama a SetForegroundWindow u otra API que lo hace indirectamente.

Sintaxis

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

Parámetros

[in] pUnk

Puntero a la interfaz IUnknown en el proxy del servidor COM de destino.

[in] lpvReserved

Este parámetro está reservado y debe ser NULL.

Valor devuelto

Esta función puede devolver los valores siguientes.

Código devuelto Descripción
S_OK
Método realizado correctamente.
E_INVALIDARG
El parámetro lpvReserved no es NULL.
E_NOINTERFACE
El parámetro pUnk no admite el control de ventana en primer plano.
E_ACCESSDENIED
El proceso de llamada no posee actualmente el privilegio de primer plano.

Comentarios

El sistema restringe qué procesos pueden llamar a las funciones SetForegroundWindow y AllowSetForegroundWindow para establecer la ventana de primer plano. Como resultado, se impide que una aplicación robe el foco de otra aplicación incluso cuando el usuario interactúe con ella. Use CoAllowSetForegroundWindow para pasar el privilegio de primer plano de un proceso que lo tiene a un proceso que aún no lo tiene. Esto se puede hacer transitivamente: pasar el privilegio de un proceso a otro y, a continuación, a otro, etc.

CoAllowSetForegroundWindow permite que un usuario que tenga una interfaz personalizada obtenga el mismo comportamiento que ocurre en las interfaces OLE en las que se espera un cambio de ventana (principalmente asociado a la vinculación e inserción).

En segundo plano, la interfaz IForegroundTransfer se usa para producir la ventana de primer plano entre procesos. Un proxy estándar proporcionado por COM ya implementa IForegroundTransfer, por lo que no tiene que hacer ningún trabajo adicional si usa un proxy estándar. Simplemente llame a CoAllowSetForegroundWindow para transferir el privilegio de primer plano a cualquier objeto COM fuera de proceso.

Ejemplos

En el ejemplo siguiente se muestra cómo un proceso de cliente puede crear un servidor COM local, llamar a CoAllowSetForegroundWindow para transferir el privilegio de primer plano y, a continuación, llamar a una función en el servidor COM que, a su vez, llama directa o indirectamente a SetForegroundWindow.

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();

Requisitos

Requisito Value
Cliente mínimo compatible Windows 2000 Professional [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows 2000 Server [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado objbase.h
Library Ole32.lib
Archivo DLL Ole32.dll
Conjunto de API ext-ms-win-com-ole32-l1-1-1 (introducido en Windows 8.1)

Consulte también

IForegroundTransfer