2009-07-14 3 views
2

Ich versuche, einen Windows-Hook zu erstellen, speziell um HSHELL_WINDOWCREATED Nachrichten abzufangen.
Allerdings wird mein Hook-Prozess nie aufgerufen.Problem mit WH_SHELL

My dll hat eine Funktion, um den Haken zu installieren:

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

hInst wurde von DllMain(), am DLL_PROCESS_ATTACH Nachricht ausgefüllt.
CreateWindowHook ist definiert als:

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

Ich erwarte, dass die proc immer dann, wenn ein neues Fenster oberste Ebene aufgerufen werden, erstellt, aber es wird nie genannt. Was vermisse ich? Danke.

Weitere Informationen:
Laut diesem Artikel - http://msdn.microsoft.com/en-us/library/ms644959(VS.85).aspx - die App, die WH_SHELL Nachrichten empfangen will, muss sich über Systemparameters registrieren():

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

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

dass Anruf in der dll gemacht wird, oder die App, die die dll lädt, die den hook enthält, oder spielt es keine Rolle?

Antwort

0

Laufen Sie auf Vista? In diesem Fall stoßen Sie wahrscheinlich auf ein UAC-Problem. Indem Sie 0 als letzten Parameter angeben, den Sie nach einem globalen Hook fragen. Dies kann nur als Administrator getan werden.

Versuchen Sie erneut als Administrator auszuführen und sehen Sie, ob das Ihr Problem behebt.

+0

Danke für die Antwort. WinXP, mein Konto ist ein Admin-Konto. – Number8

+1

Eigentlich kann ein globaler Hook als Nicht-Admin gesetzt werden, aber nur Nicht-Admin-Prozesse werden gehakt. – Andy

0

Ist Ihr Hhook sowohl initialisiert als auch in einem freigegebenen Bereich? Details siehe here.