¿Cómo interceptar eventos del teclado cuando el foco está en otra aplicación?
El mecanismo de procesamiento de mensajes de WINDOWS proporciona la función de conectar varias funciones inversas (HOOK) para monitorear varios mensajes de eventos del sistema en el programa de aplicación. Esta función de gancho (HOOK) es similar a un controlador de interrupción extendido. Se pueden conectar múltiples funciones inversas al gancho para formar una cadena de funciones de gancho. Varios mensajes generados por el sistema se envían primero a varias funciones de enlace. Las funciones de enlace monitorean, modifican y controlan los mensajes de acuerdo con sus funciones respectivas, y luego devuelven el control o pasan el mensaje a la siguiente función de enlace para finalmente implementar las funciones de ventana. Aunque este método de enlace de función inversa del sistema WINDOW afectará levemente la eficiencia operativa del sistema, es muy útil en muchas situaciones. Se pueden lograr buenos resultados inesperados utilizando de manera razonable y efectiva el mecanismo de monitoreo de función de enlace de eventos del teclado.
1. Cómo adjuntar funciones de monitoreo a los eventos del teclado de WINDOWS
Hay 11 funciones de filtro que se pueden adjuntar en VENTANA:
Función de ventana WH_CALLWNDPROC Función de filtro
WH_CBT Función de filtro de entrenamiento informático
WH_DEBUG Función de filtro de depuración
WH_GETMESSAGE Función de filtrado de mensajes
WH_HARDWARE Función de filtro de mensajes de hardware
Función de filtro de reproducción de mensajes WH_JOURNALRECORD
Función de filtro de registro de mensajes WH_JOURNALRECORD
Función de filtro de mouse WH_MOUSE
Función de filtro de mensajes WH_MSGFILTER
WH_SYSMSGFILTER función de filtrado de mensajes del sistema
Función de filtrado de teclado WH_KEYBOARD
La función de filtrado de teclado es el tipo de función de filtrado más utilizado y útil, sin importar qué tipo de función de filtrado sea, la básica. Los métodos de montaje son los mismos. Cuando WINDOW llama a la función de enlace inverso, siempre llama primero a la función al comienzo de la cadena de enlace. Por lo tanto, la función de enlace del teclado debe montarse al comienzo de la cadena de funciones usando la función SetWindowsHookEx(). Si el mensaje se pasa a la siguiente función en la cadena de funciones está determinado por la función de cada función específica. Si el mensaje debe pasarse a la siguiente función, puede llamar a CallNextHookEx() de la función API para lograrlo. Si no se aprueba, se puede devolver directamente. La función de enlace puede ser una función global utilizada para monitorear mensajes de todos los hilos, o puede ser una función local utilizada para monitorear un solo hilo individualmente. Si la función de enlace es una función local, se puede colocar en una biblioteca de enlaces dinámicos .DLL o en un módulo local, si la función de enlace es global, se debe colocar en una biblioteca de enlaces dinámicos .DLL en el medio. La función de enlace debe declararse estrictamente en el siguiente formato, tomando como ejemplo la función de enlace del teclado:
int FAR PASCAL KeyboardProc( int nCode,WORD wParam,DWORD lParam) donde KeyboardProc es el nombre de la definición función de enlace. La función debe describirse utilizando el comando EXPORTS en el archivo de definición del módulo; nCode determina si la función de enlace procesa el mensaje actual y lParam son el contenido del mensaje específico.
2. Instalación y descarga de funciones de enlace de eventos de teclado En el programa, puede utilizar la función SetWindowsHookEx() para enlazar la función de filtro. Al enlazar la función, debe indicar el tipo de función de enlace y. la entrada de la función, ya sea que la dirección y la función sean globales o locales, el formato de llamada específico de la función de enlace es el siguiente:
SetWindowsHookEx(iType,iProc,hInst,iCode) donde iType es el enlace. El tipo de función y el tipo de teclado es WH_KEYBOARD, iProc es la dirección de la función de enlace, hInst es el identificador de instancia de la biblioteca de enlaces de la función de enlace e iCode es el código de monitoreo; 0 indica una función global.
Si la función de enlace necesita pasar el mensaje a la siguiente función de filtro, la función CallNextHookEx() debe llamarse una vez antes de que regrese la función de enlace. Cuando es necesario descargar la función de enlace, solo una llamada a la función UnhookWindowsHookEx(iProc). se puede lograr. Si la función es global, entonces debe colocarse en una biblioteca de vínculos dinámicos .DLL. En este caso, el método de llamada a la función puede ser el mismo que el de otras funciones .DLL ordinarias de tres maneras:
1. En el archivo de definición DEF Utilice directamente el nombre de la función o el número de serie para describir: EXPORTS WEP @1 RESIDENTNAME InitHooksDll @2 InstallFilter @3 KeyboardProc @4 Utilice el número de serie para describir el formato: enlace nombre de la biblioteca.nombre de la función (por ejemplo, el El método de descripción en este ejemplo es KEYDLL.KeyboardProc).
2. Utilice la función para llamar directamente en el programa de aplicación: Primero, use LoadLibrary (LPSTR "nombre de biblioteca de enlaces") para cargar la biblioteca de enlaces dinámicos en el programa de aplicación y obtenga el identificador del módulo de biblioteca de carga. hInst, y luego use GetProcAddress (HINSTANCE hInst, LPSTR "Nombre del proceso de función") directamente para obtener la dirección de la función y luego llame directamente a la dirección Antes de que finalice el programa, use la función FreeLibrary () para liberar el enlace dinámico cargado. biblioteca.
3. Utilice el método de biblioteca de entrada .LIB. Utilice el programa IMPLIB.EXE para crear la biblioteca de entrada .LIB correspondiente mientras crea la biblioteca de enlaces dinámicos y luego agregue la biblioteca de entrada directamente al archivo del proyecto.