Los ganchos en los sistemas Windows tienen funciones muy poderosas. A través de esta tecnología, casi todos los mensajes en los sistemas Windows pueden interceptarse, monitorearse y procesarse. Esta tecnología se puede utilizar ampliamente en diversos software, especialmente en software que requiere monitoreo, grabación automática y otras funciones de monitoreo del sistema. Este artículo trata este tema, con la esperanza de servir como referencia para los lectores.
1. Mecanismo y tipo de gancho
Todas las aplicaciones de Windows se basan en mensajes y el funcionamiento de la aplicación depende del tipo y contenido del mensaje que recibe. Los ganchos son similares al mecanismo de procesamiento de intercepción de interrupciones de Dos. Hook es una plataforma del mecanismo de procesamiento de mensajes de Windows. Al instalar varios ganchos, la aplicación puede configurar subrutinas para monitorear ciertos mensajes en la ventana especificada y procesar el mensaje antes de que llegue a la ventana de destino.
En Windows, hay dos tipos de enganches, uno es el enganche del sistema (RemoteHook), que monitorea mensajes dentro de todo el sistema, y el otro es el enganche de hilo (LocalHook), que solo intercepta mensajes dentro del proceso. Para los enlaces del sistema, la función de enlace (HookFunction) debe implementarse en la biblioteca de enlaces dinámicos (DLL) del sistema Windows. Para los enlaces de subprocesos, la función de enlace se puede implementar en la DLL o en la aplicación correspondiente. Esto se debe a que cuando un desarrollador crea un enlace, Windows primero crea una estructura de datos en la memoria del sistema, que contiene información sobre el enlace, y luego agrega la estructura a la lista de enlaces existente, y los nuevos enlaces se ordenarán delante de los anteriores. manos. Cuando ocurre un evento, si se instala un enlace local, se llamará a la función de enlace en el proceso actual. Si es un enlace remoto, el sistema debe insertar la función de enlace en el espacio de direcciones de otros procesos. Para hacer esto, la función de enlace debe estar en una biblioteca de enlaces dinámicos, por lo que si desea utilizar un enlace remoto, debe colocarlo. el gancho Coloque la función en la biblioteca de enlaces dinámicos. Para los tipos de mensajes monitoreados por enlaces, Windows proporciona un total de los siguientes tipos: Como se muestra en la Tabla 1:
Tabla 1. Tipos de mensajes de Windows
Identificador constante del tipo de mensaje | valor | Tipo de mensaje | Ámbito de aplicación |
WH_CALLWNDPROC | 4 | Mensaje enviado a la ventana | hilo o sistema |
WH_CALLWNDPROCRET | 12 | El mensaje devuelto por la ventana. | hilo o sistema |
WH_TCC | 5 | Mensajes como cambios de ventana y configuración de enfoque. | hilo o sistema |
WH_DEBUG | 9 | Si se deben ejecutar ganchos de otros ganchos | hilo o sistema |
WH_FOREGROUNDIDLE | 11 | El programa en primer plano está inactivo | hilo o sistema |
WH_GETMESSAGE | 3 | Mensajes publicados en la cola de mensajes. | hilo o sistema |
REPRODUCCIÓN DE WH_JOURNAL | 1 | Reproducir los mensajes grabados | sistema |
WH_JOURNALRECORD | 0 | Monitorear y registrar mensajes de entrada | sistema |
WH_KEYBOARD | 2 | Mensajes de teclado | hilo o sistema |
WH_MOUSE | 7 | mensaje del ratón | hilo o sistema |
WH_MSGFILTER | -1 | Barras de desplazamiento de menú, mensajes de diálogo | hilo o sistema |
WH_SHELL | 10 | mensajes de shell | hilo o sistema |
WH_SYSMSGFILTER | 6 | Barras de desplazamiento de menú, mensajes de diálogo para todos los hilos. | sistema |
2. Implementación de ganchos en la programación VB.
(1) Formato de la función de gancho (Función HOOK). La función de enlace es en realidad una función. Si es un enlace del sistema, la función debe colocarse en la biblioteca de enlaces dinámicos. Esta función tiene un formato de parámetro determinado, que es el siguiente en VB:
Función privada HookFunc(ByVal nCode mientras, ByVal wParam mientras, ByVal lParam mientras) Mientras |
Entre ellos, nCode representa la situación en la que se genera el gancho, y hay diferentes conjuntos de valores posibles según el gancho. Los valores de retorno de los parámetros wParam y lParam incluyen el contenido del mensaje monitoreado, que varía; con el tipo de mensaje monitoreado por el Hook Difiere según el valor de nCode. Para las funciones de enlace configuradas con VB, la forma del marco general es la siguiente:
Función privada HookFunc(ByVal nCode mientras, ByVal wParam mientras, ByVal lParam mientras) Mientras Seleccione caso de nCode caso ncode<0:hookfunc=callnexthookex(hHookFunc, nCode, wParam, lParam) valor de caso 1: Procesamiento 1: HookFunc = X1 caso2:Proceso de procesamiento 2:HookFunc=X1 … finalizar seleccionar función final |
El valor de retorno de la función. Si el mensaje se va a procesar, pase 0; de lo contrario, pase 1 y consuma el mensaje.
(2) Instalación y ejecución de ganchos. Se utilizan varias funciones API para instalar enlaces: puede utilizar la función API SetWindowsHookEx() para instalar una subrutina de enlace definida por la aplicación en la lista de enlaces. La declaración de la función SetWindowsHookEx() es la siguiente:
Declarar función SetWindowsHookEx Lib user32 Alias SetWindowsHookExA(ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long |
El valor idHook es el tipo de mensaje que maneja; el valor lpfn es el puntero de dirección de la subrutina de enlace. Si el parámetro dwThreadId es 0 o el identificador de un subproceso creado por otro proceso, lpfn debe apuntar a la subrutina de enlace en la DLL. Además, lpfn puede apuntar a un código de subrutina de enlace del proceso actual. El valor hMod es el identificador de la aplicación, que identifica la DLL que contiene la subrutina señalada por lpfn. Si dwThreadId identifica un subproceso creado por el proceso actual y el código de subrutina se encuentra en el proceso actual, hMod debe ser 0. El valor dwThreadId es el identificador del subproceso asociado con el subproceso de enlace instalado. Si es 0, el subproceso de enlace está asociado con todos los subprocesos. Si el enlace se instala correctamente, se devolverá el identificador del subproceso del enlace. Si falla, se devolverá 0.
Además, la función CallNextHookEx() generalmente debe llamarse en la subrutina de enlace para ejecutar la siguiente subrutina de enlace señalada por la lista de enlaces. De lo contrario, las aplicaciones con otros enlaces instalados no recibirán notificaciones de enlaces, lo que generará resultados incorrectos. La declaración de la función CallNextHookEx() es la siguiente:
Declarar función CallNextHookEx Libuser32 Alias CallNextHookEx(ByVal hHook As Long, ByVal ncode As Lonog, ByVal wParam As Long, lParam As Any) As Long |
El valor de hHook es el valor de retorno de SetWindowsHookEx(), y nCode, wParam y lParam son los tres parámetros de la función Hook. Antes de que finalice el programa, se debe llamar a la función UnhookWindowsHookEx() para liberar los recursos del sistema asociados con el enlace. La función UnhookWindowsEx() se declara de la siguiente manera:
Declarar función Desenganchar WindowsHookEx Lib usuario32 Alias Desenganchar WindowsHookEx(ByVal hHook As Long)As Long |
hHook es el valor de retorno al instalar el gancho, es decir, el identificador del subproceso del gancho.
(3) Cuestiones a las que se debe prestar atención al instalar ganchos en VB. El parámetro lpfn es la dirección de un HookFunc. VB estipula que el código de HookFunc debe colocarse en un módulo .BAS estándar y pasarse como Dirección de HookFunc. No se puede colocar en un módulo de clase ni adjuntar a un formulario. Para RemoteHook, HookFunc debe incluirse en la biblioteca de enlaces dinámicos, por lo que si se usa RemoteHook en VB, también se usarán dos funciones API, GetModuleHandle() y GetProcAddress(). Sus declaraciones son las siguientes:
Declarar la función GetModuleHandle Likernel32 Alias GetModuleHandleA(ByVal lpModuleName As String) As Long Declarar función GetProcAddress Lib kernel32 Alias GetProcAddress (ByVal hModule As Long, ByVal lpProcName As String) As Long |
El valor hmod es el identificador del nombre del módulo que contiene el proceso de enlace. Si es LocalHook, el valor puede ser Nulo (se pasa 0 en VB), y si es RemoteHook, puede usar GetModuleHandle (name.dll) para pasarlo. .