2010-05-27 7 views
3

Je veux définir le hook global qui suit quelle application est active.Comment définir un hook global pour WH_CALLWNDPROCRET?

Dans mon programme principal que je fais le foloowing:

HMODULE mod=::GetModuleHandle(L"HookProcDll"); 
HHOOK rslt=(WH_CALLWNDPROCRET,MyCallWndRetProc,mod,0); 

La procédure de crochet qui est appelé MyCallWndRetProc existe dans dll séparé appelé HookProcDll.dll. La procédure de connexion surveille le message WM_ACTIVATE. Le fait est que le code est bloqué dans la ligne où je place le crochet, c'est-à-dire dans la ligne où j'appelle ::SetWindowsHookEx. Et puis Windows ne répond plus, ma barre des tâches disparaît et il me reste un bureau vide. Ensuite, je dois réinitialiser l'ordinateur.

Qu'est-ce qui ne va pas, pourquoi Windows ne répond pas? et Ai-je besoin d'injecter HookProcDll.dll dans chaque processus pour définir le hook global, et comment puis-je faire cela?

+0

Je pense qu'il vous manque un nom de fonction dans la deuxième ligne. Et vous n'avez pas publié le code le plus important: l'appel 'SetWindowsHookEx' et votre proc hook. – interjay

+0

Je présume que HHOOK rslt = (..) est supposé être HHOOK rslt = SetWindowsHookEx (...); – Michael

+1

Vous injectez déjà la DLL dans chaque processus. Quel est le problème, vous plantez chaque application GUI, y compris l'Explorateur Windows. Injectez-le dans votre propre premier afin que vous puissiez le déboguer. –

Répondre

1

Cela ressemble presque certainement à un bug de plantage dans MyCallWndRetProc. Vous spécifiez votre DLL hook pour être chargé dans chaque processus avec une fenêtre et il se bloque lorsque MyCallWndRetProc est appelé après un message de fenêtre. Comme il est appelé après chaque message de fenêtre dans chaque processus, il finit par supprimer tous les processus affichant l'interface utilisateur dans la session utilisateur. Vous ne pouvez même pas lancer de nouvelles applications puisque votre proc hook sera immédiatement chargé dans les applications. Inclure le code à MyCallWndRetProc, et peut-être votre DllMain aussi, devrait nous donner un aperçu de ce qui se passe.

0

C'est le code pour ma procédure de crochet, et il est stocké dans HookProcDll.dll:

#include "HookProcDll.h" 
LRESULT CALLBACK MyCallWndRetProc(
    __in int nCode, 
    __in WPARAM wParam, /* whether the msg is sent by the current process */ 
    __in LPARAM lParam /* pointer to CWPRETSTRUCT , which specifies details about the message */ 
) 
{ 
    if(nCode >=0) 
    { 
     CWPRETSTRUCT* retStruct=(CWPRETSTRUCT*)lParam; 
     if(retStruct->message == WM_ACTIVATE) 
     { 

     } 
    } 
    return ::CallNextHookEx(0,nCode,wParam,lParam); 
} 

Mon HookProcDll.dll n'a pas de fonction de DllMain explicite .La HookProcDll.dll est faite avec le projet dll visual studio donc je suppose que inclut l'implémentation standrad pour DllMain.

Questions connexes