Función SetWindowsHookExA (winuser.h)

Instala un procedimiento de enlace definido por la aplicación en una cadena de enlace. Instalaría un procedimiento de enlace para supervisar el sistema para determinados tipos de eventos. Estos eventos están asociados a un subproceso específico o a todos los subprocesos del mismo escritorio que el subproceso que llama.

Sintaxis

HHOOK SetWindowsHookExA(
  [in] int       idHook,
  [in] HOOKPROC  lpfn,
  [in] HINSTANCE hmod,
  [in] DWORD     dwThreadId
);

Parámetros

[in] idHook

Tipo: int

Tipo de procedimiento de enlace que se va a instalar. Este parámetro puede ser uno de los valores siguientes.

Valor Significado
WH_CALLWNDPROC
4

Instala un procedimiento de enlace que supervisa los mensajes antes de que el sistema los envíe al procedimiento de ventana de destino. Para obtener más información, consulte el procedimiento de enlace CallWndProc .

WH_CALLWNDPROCRET
12
Instala un procedimiento de enlace que supervisa los mensajes una vez procesados por el procedimiento de ventana de destino. Para obtener más información, consulte el procedimiento de enlace [FUNCIÓN de devolución de llamada HOOKPROC](nc-winuser-hookproc.md).
WH_CBT
5
Instala un procedimiento de enlace que recibe notificaciones útiles para una aplicación CBT. Para obtener más información, consulte el procedimiento de enlace CBTProc .
WH_DEBUG
9

Instala un procedimiento de enlace útil para depurar otros procedimientos de enlace. Para obtener más información, consulte el procedimiento de enlace DepurarProc .

WH_FOREGROUNDIDLE
11

Instala un procedimiento de enlace al que se llamará cuando el subproceso en primer plano de la aplicación esté a punto de estar inactivo. Este enlace es útil para realizar tareas de prioridad baja durante el tiempo de inactividad. Para obtener más información, vea el procedimiento de enlace ForegroundIdleProc .

WH_GETMESSAGE
3

Instala un procedimiento de enlace que supervisa los mensajes publicados en una cola de mensajes. Para obtener más información, consulte el procedimiento de enlace GetMsgProc .

WH_JOURNALPLAYBACK
1

Advertencia

Windows 11 y versiones más recientes: no se admiten las API de enlace de registro en diario. Se recomienda usar la API SendInput TextInput en su lugar.

Instala un procedimiento de enlace que publica mensajes grabados previamente por un procedimiento de enlace de WH_JOURNALRECORD . Para obtener más información, consulte el procedimiento de enlace JournalPlaybackProc .

WH_JOURNALRECORD
0

Advertencia

Windows 11 y versiones más recientes: no se admiten las API de enlace de registro en diario. Se recomienda usar la API SendInput TextInput en su lugar.

Instala un procedimiento de enlace que registra los mensajes de entrada publicados en la cola de mensajes del sistema. Este enlace es útil para grabar macros. Para obtener más información, consulte el procedimiento de enlace JournalRecordProc .

WH_KEYBOARD
2

Instala un procedimiento de enlace que supervisa los mensajes de pulsación de teclas. Para obtener más información, consulte el procedimiento de enlace KeyboardProc .

WH_KEYBOARD_LL
13
Instala un procedimiento de enlace que supervisa los eventos de entrada de teclado de bajo nivel. Para obtener más información, vea el procedimiento de enlace [LowLevelKeyboardProc](/windows/win32/winmsg/lowlevelkeyboardproc).
WH_MOUSE
7

Instala un procedimiento de enlace que supervisa los mensajes del mouse. Para obtener más información, consulte el procedimiento de enlace MouseProc .

WH_MOUSE_LL
14

Instala un procedimiento de enlace que supervisa los eventos de entrada del mouse de bajo nivel. Para obtener más información, consulte el procedimiento de enlace LowLevelMouseProc .

WH_MSGFILTER
-1

Instala un procedimiento de enlace que supervisa los mensajes generados como resultado de un evento de entrada en un cuadro de diálogo, un cuadro de mensaje, un menú o una barra de desplazamiento. Para obtener más información, consulte el procedimiento de enlace MessageProc .

WH_SHELL
10
Instala un procedimiento de enlace que recibe notificaciones útiles para las aplicaciones de shell. Para obtener más información, consulte el procedimiento de enlace ShellProc .
WH_SYSMSGFILTER
6

Instala un procedimiento de enlace que supervisa los mensajes generados como resultado de un evento de entrada en un cuadro de diálogo, un cuadro de mensaje, un menú o una barra de desplazamiento. El procedimiento de enlace supervisa estos mensajes para todas las aplicaciones del mismo escritorio que el subproceso que realiza la llamada. Para obtener más información, consulte el procedimiento de enlace SysMsgProc .

[in] lpfn

Tipo: HOOKPROC

Puntero al procedimiento de enlace. Si el parámetro dwThreadId es cero o especifica el identificador de un subproceso creado por un proceso diferente, el parámetro lpfn debe apuntar a un procedimiento de enlace en un archivo DLL. De lo contrario, lpfn puede apuntar a un procedimiento de enlace en el código asociado al proceso actual.

[in] hmod

Tipo: HINSTANCE

Identificador del archivo DLL que contiene el procedimiento de enlace al que apunta el parámetro lpfn . El parámetro hMod debe establecerse en NULL si el parámetro dwThreadId especifica un subproceso creado por el proceso actual y si el procedimiento de enlace está dentro del código asociado al proceso actual.

[in] dwThreadId

Tipo: DWORD

Identificador del subproceso con el que se va a asociar el procedimiento de enlace. En el caso de las aplicaciones de escritorio, si este parámetro es cero, el procedimiento de enlace se asocia a todos los subprocesos existentes que se ejecutan en el mismo escritorio que el subproceso que realiza la llamada. Para las aplicaciones de la Tienda Windows, consulta la sección Comentarios.

Valor devuelto

Tipo: HHOOK

Si la función se realiza correctamente, el valor devuelto es el identificador del procedimiento de enlace.

Si la función no se realiza correctamente, el valor devuelto es NULL. Para obtener información de error extendida, llame a GetLastError.

Comentarios

SetWindowsHookEx se puede usar para insertar un archivo DLL en otro proceso. Un archivo DLL de 32 bits no se puede insertar en un proceso de 64 bits y no se puede insertar un archivo DLL de 64 bits en un proceso de 32 bits. Si una aplicación requiere el uso de enlaces en otros procesos, es necesario que una aplicación de 32 bits llame a SetWindowsHookEx para insertar un archivo DLL de 32 bits en procesos de 32 bits y una aplicación de 64 bits llame a SetWindowsHookEx para insertar un archivo DLL de 64 bits en procesos de 64 bits. Los archivos DLL de 32 y 64 bits deben tener nombres diferentes.

Dado que los enlaces se ejecutan en el contexto de una aplicación, deben coincidir con el "bitness" de la aplicación. Si una aplicación de 32 bits instala un enlace global en Windows de 64 bits, el enlace de 32 bits se inserta en cada proceso de 32 bits (se aplican los límites de seguridad habituales). En un proceso de 64 bits, los subprocesos siguen marcados como "enganchados". Sin embargo, dado que una aplicación de 32 bits debe ejecutar el código de enlace, el sistema ejecuta el enlace en el contexto de la aplicación de enlace; específicamente, en el subproceso que llamó a SetWindowsHookEx. Esto significa que la aplicación de enlace debe seguir bombeando mensajes o podría bloquear el funcionamiento normal de los procesos de 64 bits.

Si una aplicación de 64 bits instala un enlace global en Windows de 64 bits, el enlace de 64 bits se inserta en cada proceso de 64 bits, mientras que los procesos de 32 bits usan una devolución de llamada a la aplicación de enlace.

Para enlazar todas las aplicaciones en el escritorio de una instalación de Windows de 64 bits, instale un enlace global de 32 bits y un enlace global de 64 bits, cada uno de los procesos adecuados y asegúrese de seguir bombeando mensajes en la aplicación de enlace para evitar el bloqueo del funcionamiento normal. Si ya tiene una aplicación de enlace global de 32 bits y no necesita ejecutarse en el contexto de cada aplicación, es posible que no necesite crear una versión de 64 bits.

Puede producirse un error si el parámetro hMod es NULL y el parámetro dwThreadId es cero o especifica el identificador de un subproceso creado por otro proceso.

Llamar a la función CallNextHookEx para encadenar al siguiente procedimiento de enlace es opcional, pero es muy recomendable; De lo contrario, otras aplicaciones que tienen enlaces instalados no recibirán notificaciones de enlace y pueden comportarse incorrectamente como resultado. Debe llamar a CallNextHookEx a menos que necesite evitar que otras aplicaciones vean la notificación.

Antes de finalizar, una aplicación debe llamar a la función UnhookWindowsHookEx para liberar los recursos del sistema asociados al enlace.

El ámbito de un enlace depende del tipo de enlace. Algunos enlaces solo se pueden establecer con ámbito global; otros también se pueden establecer para un subproceso específico, como se muestra en la tabla siguiente.

Enlace Ámbito
WH_CALLWNDPROC Subproceso o global
WH_CALLWNDPROCRET Subproceso o global
WH_CBT Subproceso o global
WH_DEBUG Subproceso o global
WH_FOREGROUNDIDLE Subproceso o global
WH_GETMESSAGE Subproceso o global
WH_JOURNALPLAYBACK Solo global
WH_JOURNALRECORD Solo global
WH_KEYBOARD Subproceso o global
WH_KEYBOARD_LL Solo global
WH_MOUSE Subproceso o global
WH_MOUSE_LL Solo global
WH_MSGFILTER Subproceso o global
WH_SHELL Subproceso o global
WH_SYSMSGFILTER Solo global

En el caso de un tipo de enlace especificado, primero se llaman enlaces de subproceso y, a continuación, enlaces globales. Tenga en cuenta que se puede llamar a los enlaces de WH_MOUSE, WH_KEYBOARD, WH_JOURNAL*, WH_SHELL y de bajo nivel en el subproceso que instaló el enlace en lugar del subproceso que procesa el enlace. Para estos enlaces, es posible que se llame a los enlaces de 32 y 64 bits si un enlace de 32 bits está por delante de un enlace de 64 bits en la cadena de enlace.

Los enlaces globales son un recurso compartido y la instalación de una afecta a todas las aplicaciones del mismo escritorio que el subproceso que realiza la llamada. Todas las funciones de enlace global deben estar en bibliotecas. Los enlaces globales deben restringirse a aplicaciones de uso especial o usarse como ayuda para el desarrollo durante la depuración de aplicaciones. Las bibliotecas que ya no necesitan un enlace deben quitar su procedimiento de enlace.

Desarrollo de aplicaciones de la Tienda Windows Si dwThreadId es cero, 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 uiAccess (herramientas de accesibilidad). La notificación se entrega en el subproceso del instalador para estos enlaces:

  • WH_JOURNALPLAYBACK
  • WH_JOURNALRECORD
  • WH_KEYBOARD
  • WH_KEYBOARD_LL
  • WH_MOUSE
  • WH_MOUSE_LL
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

Para obtener un ejemplo, consulte Instalación y liberación de procedimientos de enlace.

Nota

El encabezado winuser.h define SetWindowsHookEx como alias que selecciona automáticamente la versión ANSI o Unicode de esta función en función de la definición de la constante de preprocesador UNICODE. La combinación del uso del alias neutral de codificación con código que no es neutral de codificación puede dar lugar a errores de coincidencia que dan lugar a errores de compilación o tiempo de ejecución. Para obtener más información, vea Convenciones para prototipos de función.

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 winuser.h (incluir Windows.h)
Library User32.lib
Archivo DLL User32.dll
Conjunto de API ext-ms-win-ntuser-window-l1-1-0 (introducido en Windows 8)

Consulte también

Función CallNextHookEx

Función CallWindowProc

Función UnhookWindowsHookEx

CBTProc

CallWndProc

CallWndRetProc

DepurarProc

ForegroundIdleProc

GetMsgProc

JournalPlaybackProc

JournalRecordProc

KeyboardProc

LowLevelKeyboardProc

LowLevelMouseProc

MessageProc

MouseProc

ShellProc

SysMsgProc

Conceptual

Enlaces