Question

Deux questions.

1) Je comprends que ce doit être un résultat attendu, mais peut-être que quelqu'un peut me dire ce que je fais mal; Je suis en train de sous-classe toutes les classes de fenêtre dans un hook global et il fonctionne, sauf que je ne suis pas en mesure de fermer boutique que je devrais et lorsque le programme l'enregistrement d'abord le crochet désinscrit le crochet et les sorties, les applications commencent à s'écraser sous-classées.

Voici comment je suis en train de le faire ..

// 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;
}

Dans DllMain Je ne fais rien sur DLL_PROCESS_DETACH. Au lieu de cela, ClearHooks () est appelée à partir du programme l'enregistrement à l'origine des crochets et il seulement après que le crochet a envoyé une signalisation de message qu'il a exécuté l'opération EnumWindows (voir ci-dessus Restaure de wndprocs, d'origine).

fenêtres de I dans un crochet WndProc; toutes les fenêtres visibles qui reçoivent un message et dont wndproc courant n'est pas celui de la dll, sont sous-classés.

En fait tout (pour autant que je peux dire) les applications plantent à la sortie malgré le fait que les fenêtres ne semblent pour obtenir le retour du jeu de wndproc à ce qu'il était quand il a été remplacé. Quelqu'un at-il une idée de ce que je pourrais faire mal?

2) Je en ai besoin pour intercepter WM_MINMAXINFO et fenêtre de modification maxsize chaque fois qu'une fenêtre est agrandie. Malheureusement, je ne peux pas le faire dans le dll mais je dois parler avec un programme pour obtenir les informations de taille. Alors, quelle est la meilleure façon de parler de cette fenêtre; J'ai besoin pour passer de nouveau quelques informations afin que je puisse modifier la structure qui est venu avec le message d'WM_MINMAXINFO d'origine. Est-ce une structure WM_COPYDATA conserver les données de jusqu'à ce que l'appel au retour SendMessageTimeout?

Merci

Était-ce utile?

La solution

Il y a beaucoup de points de douleur ici. Vous assumez qu'aucun autre code sous-classe de la fenêtre. Et que cette sous-classe non de la volonté de code dans le bon ordre. Il n'y a pas bon ordre, votre crochetage est tout à fait asynchrone de l'exécution du programme.

Mais, la solution de contournement est assez simple. Vous avec déjà accrochage SetWindowsHookEx, pourrait aussi bien faire un plus. WH_CALLWNDPROC ou WH_CALLWNDPROCRET, selon ce que vous voulez faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top