Pregunta

Dos preguntas.

1) entiendo que esto debe ser un resultado esperado, pero tal vez alguien me puede decir lo que estoy haciendo mal; Estoy intentando subclase todas las clases de ventana en un enlace global y funciona, excepto que no soy capaz de cerrar la tienda como debería y cuando el programa de registro inicialmente el gancho elimina el registro del gancho y salidas, aplicaciones subclasificadas empiezan a estrellarse.

Así es como estoy tratando de hacerlo ..

// stores original wndprocs. In the hook dll, outside the shared memory.
map<HWND, WNDPROC> origWndProcs;

// in an EnumWindows callback, executed for all HWND's, also in the hook dll (UWM_REMOVE_HOOK is a registered unique message)
SendMessageTimeout(hWnd, UWM_REMOVE_HOOK, 0, 0, SMTO_ABORTIFHUNG | SMTO_NORMAL, 15000, res);

// Still in the same hook, in the subclassing wndproc..
if (msg == UWM_REMOVE_HOOK) {
   if (origWndProcs.find(hwnd) != origWndProcs.end()) {
      SetWindowLongPtr(hwnd, GWL_WNDPROC, (LONG_PTR)origWndProcs[hwnd]);
   }
}

// clears the hook..
__declspec(dllexport) BOOL ClearHooks(HWND hWnd) {

    BOOL unhooked = UnhookWindowsHookEx(hook) &&
       UnhookWindowsHookEx(kb_hook) &&
       UnhookWindowsHookEx(mouse_hook) && 
       UnhookWindowsHookEx(cbt_hook);

    if(unhooked)
       hWndServer = NULL;
    return unhooked;
}

En DllMain no hago nada en DLL_PROCESS_DETACH. En su lugar, ClearHooks () se llama desde el programa de registrarse originalmente los ganchos y no sólo después de que el gancho ha enviado una señalización de mensaje que ha ejecutado la operación EnumWindows (Restaura wndProcs originales, ver arriba).

I subclase ventanas en un gancho WndProc; todas las ventanas visibles que reciben un mensaje y cuya wndproc actual no es el que está en el archivo DLL, son subclases.

Básicamente todo (por lo que puedo decir) aplicaciones se cuelgan en la salida a pesar del hecho de que las ventanas parecen obtener el conjunto posterior wndproc a lo que era cuando fue sustituido. Alguien tiene una idea de lo que podría estar haciendo mal?

2) Necesito esto para interceptar y modificar WM_MINMAXINFO maxsize ventana cada vez que se maximiza una ventana. Por desgracia, no puedo hacer esto en el DLL, pero tengo que hablar con un programa para obtener la información de tamaño. Así que, ¿cuál es la mejor manera de hablar con esa ventana; Lo necesito para pasar de nuevo algo de información para que pueda modificar la estructura que se incluye con el mensaje original de WM_MINMAXINFO. Tendrá una estructura en la WM_COPYDATA conservar sus datos quedarán hasta que la llamada a la rentabilidad SendMessageTimeout?

Gracias

¿Fue útil?

Solución

Hay un montón de puntos de dolor aquí. Usted asume que ningún otro código subclase de la ventana. Y que dicho código no-voluntad subclase en el orden correcto. No hay un orden correcto, su enganche es bastante asíncrono de la ejecución del programa.

Sin embargo, la solución es bastante simple. Ya están conectando con SetWindowsHookEx, como bien podría hacer una más. WH_CALLWNDPROC o WH_CALLWNDPROCRET, dependiendo de lo que quiere hacer.

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