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 |
---|---|
|
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 . |
|
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). |
|
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 . |
|
Instala un procedimiento de enlace útil para depurar otros procedimientos de enlace. Para obtener más información, consulte el procedimiento de enlace DepurarProc . |
|
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 . |
|
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 . |
|
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 . |
|
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 . |
|
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 . |
|
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). |
|
Instala un procedimiento de enlace que supervisa los mensajes del mouse. Para obtener más información, consulte el procedimiento de enlace MouseProc . |
|
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 . |
|
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 . |
|
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 . |
|
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
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
Conceptual