2010-01-13 11 views
8

Soy la creación de un bajo nivel gancho de ratón con SetWindowsHookEx:¿En qué hilo se ejecuta una devolución de llamada de enganche de mouse y teclado de bajo nivel?

HANDLE handle = SetWindowsHookEx(WH_MOUSE_LL, 
           &callback, 
           GetModuleHandle(NULL), 
           NULL); 

Debido a que esta es una devolución de llamada de bajo nivel, que se ejecutará dentro de mi propio proceso; no se realiza una inyección DLL.

Ahora, me he dado cuenta de que la devolución de llamada a veces (indirectamente) se invoca desde las funciones estándar de API como GetAncestor, GetWindowRect y tal. Parece que estos pueden hacer que se vacíe algo de la cola de mensajes.

En realidad, mi pregunta es triple ...

  1. Cuando se llama la devolución de llamada?

    ¿Se puede llamar desde adentro cualquiera función API? ¿Cómo lo digo?

  2. Por lo que el hilo se ejecuta la devolución de llamada?

    Será solamente se ejecutan en el hilo que instala el gancho, o puede llamar al sistema en cualquier tema?

  3. ¿Por qué ganchos implementados como una devolución de llamada en el primer lugar?

    (no Raymond Chen colgar por aquí?) Sería mucho más sentido para mí para poner en práctica simplemente como ganchos (enviado) los mensajes, al igual que casi todo el resto de Windows. Para los mensajes, por lo menos sé qué funciones puede causar la espera de los mensajes enviados para ser procesados ​​(GetMessage, PeekMessage y un puñado de otros), y me gustaría saber en qué hilo se procesan (el hilo que recibió el mensaje en primer lugar) .

Respuesta

8
  1. Ver 3.

  2. Está escrito con toda claridad en el documentation:

    [...] Sin embargo, el gancho se WH_MOUSE_LL no inyectan en otro proceso. En cambio, el contexto vuelve al proceso que instaló el enlace y se llama en su contexto original. Luego, el contexto vuelve a la aplicación que generó el evento. [...] Este enlace se le llama en el contexto de la rosca que lo instaló.

  3. realidad se implementan como esa:

    [...] La llamada se realiza mediante el envío de un mensaje al hilo que instala el gancho. Por lo tanto, el hilo que instaló el gancho debe tener un bucle de mensaje.

yo sepa, cuando el gancho debe ser llamado de Windows coloca un mensaje especial en la cola de mensajes del hilo.Su código en la bomba de mensajes llama a Peek/GetMessage, que verifica si es el mensaje especial y, si lo es, llama a su procedimiento de enlace (alguna evidencia here, de donde tomé la imagen). Hook dispatching call stack http://cboard.cprogramming.com/attachments/windows-programming/9323d1253895425-setwindowshookex-lowlevelmouseproc-hook-callback-callstack-png

+2

Si me disculpan, golpearé mi cabeza contra la pared por un tiempo. Muchas gracias! – Thomas

+0

Mi pregunta sería "¿por qué tienen un comportamiento diferente para WH_MOUSE_LL vs. WH_MOUSE?" (uno requiere un dll, se ejecuta en el hilo de aplicaciones, uno puede funcionar en un exe, en su propio hilo) como ... ¿es esto para que sea más fácil para nosotros, pero solo es para esos eventos en particular, eh? – rogerdpack

+0

@rogerdpack: que en su mayoría no está relacionado con el problema original, debe publicar su propia pregunta al respecto. –

Cuestiones relacionadas