Pregunta

Puedo configurar correctamente un enlace de Windows, pero me confunde la línea en MSDN que dice "Llamar a la función CallNextHookEx para encadenar al siguiente procedimiento de enlace es opcional, pero es muy recomendable; de lo contrario, otras aplicaciones que hayan instalado enlaces no recibirán notificaciones de enlace y, como resultado, pueden comportarse incorrectamente. Debería llamar a CallNextHookEx a menos que sea absolutamente necesario para evitar que otras aplicaciones vean la notificación. & Quot ;.

Quiero ser un buen ciudadano de programación y llamar al siguiente enlace. Pero, mi procedimiento de gancho se ve así:

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(...);
        ...
}

Entonces, ¿qué sucede en el procedimiento de enlace si el código no es el que me interesa? ¿Cómo llamo al siguiente enlace?

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

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

¿Fue útil?

Solución

Según los documentos, lo correcto es pasar los argumentos que recibió directamente a CallNextHookEx, exactamente como los recibió. También debe llamar a CallNextHookEx independientemente de si decidió manejar el mensaje de enlace.

Según MSDN , el primer parámetro para CallNextHookEx se ignora en NT / XP / 2003, y para sistemas operativos más antiguos basados ??en Win95 debe ser el HHOOK que recibió cuando 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í.

Dado todo esto, una buena manera de codificar el método para los sistemas operativos de la familia NT podría ser esta:

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 se asegura de que siempre llame al gancho al final de su procesamiento, y hace que sea difícil agregar accidentalmente un return que evitará CallNextHookEx .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top