2011-12-26 21 views
9

No tengo idea de cómo funcionan los ganchos de ventana al "nivel del sistema". MSDN sólo se toca lo que está pasando muy brevemente:Ganchos para ventanas: ¿cómo funcionan?

Un gancho es un punto en el mecanismo de tratamiento de mensajes de sistema en el que una aplicación puede instalar una subrutina para controlar el tráfico de mensajes en el sistema y procesar ciertos tipos de mensajes antes de que lleguen al procedimiento de ventana de destino .

Mi mejor conjetura es algo parecido a continuación:

enter image description here

Antes de añadir cada mensaje a la cola de mensajes para una ventana, que va a enviar primero el mensaje a los ganchos global/local, que puede hacer algo, dependiendo de sus procedimientos de enlace. Después de todos los enganches globales y ganchos locales, el mensaje finalmente se agrega a la cola de mensajes de la ventana.

Sin embargo, MSDN dice que para algunos de los tipos de ganchos, monitorizará events, notifications etc.

Un ejemplo es el WH_MOUSE_LL gancho:

instala un procedimiento de enlace que monitorea baja nivel mouse eventos de entrada. Para obtener más información, vea el procedimiento de hook LowLevelMouseProc.

Cuando dicen events, ¿estamos hablando de mensajes de ventana, o significan algo más?

¿Estoy completamente equivocado?

+8

Puntos de estilo de bonificación para una imagen de un diagrama a mano alzada. – rkb

+1

Aquí hay una pequeña explicación http://b.1asphost.com/mmbaig/Tutorials/Windows_Hooks.html –

+2

Muchos ganchos se basan en mensajes. Pero no es el gancho del que hablas, en realidad lo desencadena un "evento". Se ejecuta solo * antes * Windows crea el mensaje y lo coloca en la cola de mensajes de la ventana que tiene el foco. Compare con WH_MOUSE, un gancho global que se ejecuta cuando una aplicación llama a Get/PeekMessage y está a punto de recuperar un mensaje del mouse desde la cola de mensajes. Por lo tanto, realmente se desencadena por un mensaje. –

Respuesta

1

Sí, este es un mecanismo para mensajes de Windows, puede procesar estos datos (mensajes) antes de que lleguen al procedimiento de ventana de destino (bucle de mensaje).

Si desea enganchar otras ventanas de proceso simplemente puede hacer esto en DLL, y usar inyección DLL para inyectar su biblioteca a otro proceso.