Compartir a través de


Función SetWinEventHook (winuser.h)

Establece una función de enlace de eventos para un intervalo de eventos.

Sintaxis

HWINEVENTHOOK SetWinEventHook(
  [in] DWORD        eventMin,
  [in] DWORD        eventMax,
  [in] HMODULE      hmodWinEventProc,
  [in] WINEVENTPROC pfnWinEventProc,
  [in] DWORD        idProcess,
  [in] DWORD        idThread,
  [in] DWORD        dwFlags
);

Parámetros

[in] eventMin

Tipo: UINT

Especifica la constante de evento para el valor de evento más bajo en el intervalo de eventos que controla la función de enlace. Este parámetro se puede establecer en EVENT_MIN para indicar el valor de evento más bajo posible.

[in] eventMax

Tipo: UINT

Especifica la constante de evento para el valor de evento más alto en el intervalo de eventos que controla la función de enlace. Este parámetro se puede establecer en EVENT_MAX para indicar el valor de evento más alto posible.

[in] hmodWinEventProc

Tipo: HMODULE

Identificador del archivo DLL que contiene la función de enlace en lpfnWinEventProc, si se especifica la marca WINEVENT_INCONTEXT en el parámetro dwFlags . Si la función de enlace no se encuentra en un archivo DLL o si se especifica la marca WINEVENT_OUTOFCONTEXT, este parámetro es NULL.

[in] pfnWinEventProc

Tipo: WINEVENTPROC

Puntero a la función de enlace de eventos. Para obtener más información sobre esta función, vea WinEventProc.

[in] idProcess

Tipo: DWORD

Especifica el identificador del proceso desde el que la función de enlace recibe eventos. Especifique cero (0) para recibir eventos de todos los procesos del escritorio actual.

[in] idThread

Tipo: DWORD

Especifica el identificador del subproceso desde el que la función de enlace recibe eventos. Si este parámetro es cero, la función de enlace se asocia a todos los subprocesos existentes en el escritorio actual.

[in] dwFlags

Tipo: UINT

Valores de marca que especifican la ubicación de la función de enlace y de los eventos que se van a omitir. Las marcas siguientes son válidas:

Valor Significado
WINEVENT_INCONTEXT
El archivo DLL que contiene la función de devolución de llamada se asigna al espacio de direcciones del proceso que genera el evento. Con esta marca, el sistema envía notificaciones de eventos a la función de devolución de llamada a medida que se producen. La función de enlace debe estar en un archivo DLL cuando se especifica esta marca. Esta marca no tiene ningún efecto cuando el proceso de llamada y el proceso de generación no son procesos de 32 o 64 bits, o cuando el proceso de generación es una aplicación de consola. Para obtener más información, vea Funciones de enlace en contexto.
WINEVENT_OUTOFCONTEXT
La función de devolución de llamada no está asignada al espacio de direcciones del proceso que genera el evento. Dado que se llama a la función de enlace a través de los límites del proceso, el sistema debe poner en cola los eventos. Aunque este método es asincrónico, se garantiza que los eventos están en orden secuencial. Para obtener más información, vea Funciones de enlace fuera de contexto.
WINEVENT_SKIPOWNPROCESS
Impide que esta instancia del enlace reciba los eventos generados por subprocesos en este proceso. Esta marca no impide que los subprocesos generen eventos.
WINEVENT_SKIPOWNTHREAD
Impide que esta instancia del enlace reciba los eventos generados por el subproceso que registra este enlace.
 

Las siguientes combinaciones de marcas son válidas:

  • WINEVENT_INCONTEXT | WINEVENT_SKIPOWNPROCESS
  • WINEVENT_INCONTEXT | WINEVENT_SKIPOWNTHREAD
  • WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS
  • WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNTHREAD
Además, las aplicaciones cliente pueden especificar WINEVENT_INCONTEXT o WINEVENT_OUTOFCONTEXT solo.

Consulta la sección Comentarios para obtener información sobre el desarrollo de aplicaciones de la Tienda Windows.

Valor devuelto

Tipo: HWINEVENTHOOK

Si se ejecuta correctamente, devuelve un valor HWINEVENTHOOK que identifica esta instancia de enlace de eventos. Las aplicaciones guardan este valor devuelto para usarlo con la función UnhookWinEvent .

Si no se realiza correctamente, devuelve cero.

Comentarios

Esta función permite a los clientes especificar qué procesos y subprocesos están interesados.

Si el parámetro idProcess es distinto de cero y idThread es cero, la función de enlace recibe los eventos especificados de todos los subprocesos de ese proceso. Si el parámetro idProcess es cero y idThread es distinto de cero, la función de enlace recibe los eventos especificados solo del subproceso especificado por idThread. Si ambos son cero, la función de enlace recibe los eventos especificados de todos los subprocesos y procesos.

Los clientes pueden llamar a SetWinEventHook varias veces si desean registrar funciones de enlace adicionales o escuchar eventos adicionales.

El subproceso de cliente que llama a SetWinEventHook debe tener un bucle de mensajes para recibir eventos.

Al usar SetWinEventHook para establecer una devolución de llamada en código administrado, debe usar la estructura GCHandle para evitar excepciones. Esto indica al recolector de elementos no utilizados que no mueva la devolución de llamada.

En el caso de los eventos fuera del contexto, el evento se entrega en el mismo subproceso que llamó a SetWinEventHook. En algunas situaciones, incluso si solicita eventos WINEVENT_INCONTEXT, los eventos se seguirán entregando fuera del contexto. Estos escenarios incluyen eventos de ventanas de consola y eventos de procesos que tienen una profundidad de bits diferente (64 bits frente a 32 bits) que el autor de la llamada.

Mientras una función de enlace procesa un evento, se pueden desencadenar eventos adicionales, lo que puede hacer que la función de enlace se vuelva a escribir antes de que finalice el procesamiento del evento original. El problema con la reentrada en las funciones de enlace es que los eventos se completan fuera de secuencia a menos que la función de enlace controle esta situación. Para obtener más información, vea Protección contra reentrada.

Desarrollo de aplicaciones de la Tienda Windows Si dwFlags es WINEVENT_INCONTEXT AND (idProcess = 0 | idThread = 0), los archivos DLL de enlace de ventana no se cargan en proceso para los procesos de la aplicación de la Tienda Windows y el proceso de agente de Windows Runtime a menos que los instalen los procesos de UIAccess (herramientas de accesibilidad). La notificación se entrega en el subproceso del instalador.

Este comportamiento es similar al que ocurre cuando hay una discrepancia de arquitectura entre el archivo DLL de enlace y el proceso de aplicación de destino, por ejemplo, cuando el archivo DLL de enlace es de 32 bits y el proceso de aplicación de 64 bits.

Ejemplos

En el código de ejemplo siguiente se muestra cómo una aplicación cliente puede escuchar eventos menu-start y menu-end. Para simplificar, el controlador de eventos simplemente envía información a la salida estándar.


// Global variable.
HWINEVENTHOOK g_hook;

// Initializes COM and sets up the event hook.
//
void InitializeMSAA()
{
    CoInitialize(NULL);
    g_hook = SetWinEventHook(
        EVENT_SYSTEM_MENUSTART, EVENT_SYSTEM_MENUEND,  // Range of events (4 to 5).
        NULL,                                          // Handle to DLL.
        HandleWinEvent,                                // The callback.
        0, 0,              // Process and thread IDs of interest (0 = all)
        WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS); // Flags.
}

// Unhooks the event and shuts down COM.
//
void ShutdownMSAA()
{
    UnhookWinEvent(g_hook);
    CoUninitialize();
}

// Callback function that handles events.
//
void CALLBACK HandleWinEvent(HWINEVENTHOOK hook, DWORD event, HWND hwnd, 
                             LONG idObject, LONG idChild, 
                             DWORD dwEventThread, DWORD dwmsEventTime)
{
    IAccessible* pAcc = NULL;
    VARIANT varChild;
    HRESULT hr = AccessibleObjectFromEvent(hwnd, idObject, idChild, &pAcc, &varChild);  
    if ((hr == S_OK) && (pAcc != NULL))
    {
        BSTR bstrName;
        pAcc->get_accName(varChild, &bstrName);
        if (event == EVENT_SYSTEM_MENUSTART) 
        {
            printf("Begin: ");
        }
        else if (event == EVENT_SYSTEM_MENUEND)
        {
            printf("End:   ");
        }
        printf("%S\n", bstrName);
        SysFreeString(bstrName);
        pAcc->Release();
    }
}

Requisitos

Requisito Value
Cliente mínimo compatible Windows 2000 Professional [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2003 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado winuser.h (incluir Windows.h)
Library User32.lib
Archivo DLL User32.dll
Redistribuible RDK de accesibilidad activa 1.3 en Windows NT 4.0 con SP6 y versiones posteriores y Windows 95

Consulte también

Registro de una función de enlace

UnhookWinEvent

WinEventProc