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 |
---|---|
|
Método realizado correctamente. |
|
El parámetro lpvReserved no es NULL. |
|
El parámetro pUnk no admite el control de ventana en primer plano. |
|
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) |