2008-10-17 17 views
8

Puedo configurar correctamente un gancho de Windows, pero me confunde la línea en MSDN que dice "Llamar a la función CallNextHookEx para encadenar al próximo procedimiento de gancho es opcional, pero es muy recomendable De lo contrario, otras aplicaciones que tienen ganchos instalados no recibirán notificaciones de gancho y pueden tener un comportamiento incorrecto como resultado. Debería llamar a CallNextHookEx a menos que sea absolutamente necesario evitar que otras aplicaciones vean la notificación ".Cómo usar correctamente SetWindowsHookEx & CallNextHookEx

Quiero ser un buen ciudadano de programación y llamar al próximo gancho. Pero, mi procedimiento de enlace es el siguiente:

LRESULT CALLBACK CBTProc(int code, WPARAM wp, LPARAM lp) 
{ 
    if (code != HCBT_CREATEWND) 
     { 
       // What do I do here? It's not the event I requested so how do I pass it on? 
     return 0; 
    } 

    // It's the code we want (create window) 
     CallNextHookEx(...); 
     ... 
} 

Por lo tanto, lo que sucede en el procedimiento de enlace si el código no es el que me interesa? ¿Cómo llamo al siguiente gancho?

Editar: El problema principal es que un HHOOK se devuelve desde el SetWindowsHookEx, y que debe pasar a la función CallNextHookEx.

Actualización: Parece el parámetro gancho se ignora en las plataformas NT:
http://msdn.microsoft.com/en-us/library/ms644974.aspx
http://www.klenotic.com/pl/null_hhook/

Respuesta

10

De acuerdo con los documentos, lo más apropiado que hacer es pasar los argumentos que recibió directamente a CallNextHookEx, exactamente como los recibiste También debe llamar a CallNextHookEx independientemente de si decidió manejar el mensaje de enlace.

According to MSDN, el primer parámetro a CallNextHookEx se ignora en el NT/XP/2003, y para los sistemas operativos basados ​​en Win95 de más edad que debe ser el HHOOK que recibió cuando se registró su gancho con SetWindowsHookEx. Los documentos no especifican un valor para Windows 2000, pero como es parte de la familia NT, una suposición razonable es que también se ignora allí.

Teniendo en cuenta todo esto, una buena manera de codificar el método para sistemas operativos NT-familia podría ser la siguiente:

LRESULT CALLBACK CBTProc(int code, WPARAM wp, LPARAM lp) 
{ 
    if(code == HCBT_CREATEWND) 
     ProcessCreateWnd(wp, lp); 
    return CallNextHookEx(0, code, wp, lp); 
} 

void ProcessCreateWnd(WPARAM wp, LPARAM lp) 
{ 
    // my code here 
} 

Esto asegura que siempre se llama al gancho en el extremo de su procesamiento y marcas es difícil agregar accidentalmente un return que omitirá CallNextHookEx.

+0

Eso no funciona porque CallNextHookEx toma un parámetro HHOOK (devuelto por SetWindowsHookEx). –

+0

Vaya, lo siento, actualizaré mi respuesta. – Charlie

+0

Hmm, podrías encontrar algo ahí. Me perdí el truco sobre el parámetro "hhk" que se ignora en NT/XP/2003. Voy a darle una pequeña prueba ahora. –

Cuestiones relacionadas