2009-07-14 12 views
2

J'essaie de créer un hook Windows, spécifiquement pour intercepter les messages HSHELL_WINDOWCREATED.
Cependant, mon proc de hook n'est jamais appelé.Problème avec WH_SHELL

Mon dll a une fonction d'installer le crochet:

hHook = SetWindowsHookEx(WH_SHELL, (HOOKPROC)CreateWindowHook, hinst, 0); 

hinst a été rempli par DllMain(), au message DLL_PROCESS_ATTACH.
CreateWindowHook est défini comme:

LRESULT CALLBACK CreateWindowHook(int code, WPARAM wParam, LPARAM lParam) { 
    if (code == HSHELL_WINDOWCREATED) { 
     // snip 
    } 
    return CallNextHookEx(0, code, wParam, lParam); 
} 

Je pense que le proc à appeler chaque fois qu'une nouvelle fenêtre de niveau supérieur est créé, mais il est jamais appelé. Qu'est-ce que je rate? Merci.

Plus d'informations:
Selon cet article - http://msdn.microsoft.com/en-us/library/ms644959(VS.85).aspx - l'application qui veut recevoir des messages WH_SHELL doit se faire enregistrer par SystemParametersInfo():

MINIMIZEDMETRICS st; 
st.cbSize = sizeof(MINIMIZEDMETRICS); 
st.iArrange = ARW_HIDE; 
BOOL ret; 

ret = SystemParametersInfo(
    SPI_SETMINIMIZEDMETRICS, 
    sizeof(MINIMIZEDMETRICS), 
    &st, 
    0); 

Est-ce que l'appel fait dans la dll, ou l'application qui charge la DLL contenant le crochet, ou n'est-ce pas important?

Répondre

0

Courez-vous sur Vista? Si c'est le cas, vous risquez de rencontrer un problème d'UAC. En spécifiant 0 comme dernier paramètre, vous demandez un hook global. Cela ne peut être fait en tant qu'administrateur. Essayez de réexécuter en tant qu'administrateur et voyez si cela résout votre problème.

+0

Merci pour la réponse. WinXP, mon compte est un compte admin. – Number8

+1

En fait, un hook global peut être défini comme non-admin, mais seuls les processus non-admin seront hookés. – Andy

0

Votre hhook est-il initialisé et dans une section partagée? Voir here pour plus de détails.