Wndproc Hook - systemweit, viele Programme crashen, aber wieso?
-
Hallo,
ich habe zum Spaß ein kleines Programm geschrieben, welches allen Fenstern einen neuen Titel gibt, wenn sie die Nachricht WM_CREATE oder WM_SIZE erhalten...nur einige Programme kommen mit dem Hook nicht zu Recht...wisst ihr was ich falsch gemacht habe?
Hier der Code von der DLL:#include "stdafx.h" static HINSTANCE g_hModule = NULL; LRESULT CALLBACK CallWndProc( int nCode, // hook code WPARAM wParam, // current-process flag LPARAM lParam // address of structure with message data ); extern "C" __declspec(dllexport) void Start(); extern "C" __declspec(dllexport) void Stop(); HHOOK m_wndhook; BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: //MessageBox(0, "jetzt gehts los :>", 0, 0); g_hModule = (HINSTANCE) hModule; break; case DLL_PROCESS_DETACH: //if(m_wndhook) //UnhookWindowsHookEx(m_wndhook); break; } return TRUE; } LRESULT CALLBACK CallWndProc( int nCode, // hook code WPARAM wParam, // current-process flag LPARAM lParam // address of structure with message data ) { if(nCode == HC_ACTION) { CWPSTRUCT* wpStruct = (CWPSTRUCT*)lParam; switch(wpStruct->message) { case WM_CREATE: SetWindowText(wpStruct->hwnd, "Lustiger Spass, nicht?"); break; case WM_SIZE: SetWindowText(wpStruct->hwnd, "Lustiger Spass, nicht?"); break; } } return CallNextHookEx(m_wndhook, nCode, wParam, lParam); } extern "C" __declspec(dllexport) void Start() { //MessageBox(0, "los gings",0,0); m_wndhook = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)CallWndProc, g_hModule, 0); } extern "C" __declspec(dllexport) void Stop() { if(m_wndhook) UnhookWindowsHookEx(m_wndhook); }Und hier der Code in meiner Anwendung, um den Hook zu aktivieren:
HMODULE hDll = LoadLibrary("Lustig.dll"); _Start = (LPF_START)GetProcAddress(hDll, "Start"); _Stop = (LPF_STOP)GetProcAddress(hDll, "Stop"); _Start();Rest ist uninteressant, weil der noch nicht ausgeführt wird....
mach ich was falsch oder kommt der Explorer zB nicht mit attachten DLLs klar?Gruß,
Kevin
-
m_wndhook ist nur in der Instanz der DLL gültig, in der du Start() aufrufst. In allen anderen ist es glaube 0 (globale Variablen werden doch automatisch mit 0 initialisiert). Somit hat der Aufruf von CallNextHookEx() wenig Sinn und liefert nur einen Fehler (Invalid Handle).
BTW: es könnte durchaus sein, dass manche Programme nicht damit klarkommen, dass jeder Fenstertext (auch Childs) in einen anderen umgewandelt wird.
-
ne am m_wndhook sollte es nicht liegen weil sonst würde es doch nie gehen? Sonst noch Möglichkeiten?
-
CallWndProc() wird trotzdem aufgerufen, nur keine weiteren Hooks (und die originale WndProc?), aber wenn du es sowieso besser weist...
-
aber es muss doch eine Möglichkeit geben in dem Fall den weitern Hooks bescheid zu geben? Umsonst wird es die Möglichkeit der globalen Hooks ja wohl kaum geben

-
wenn ich SetWindowText aus WM_CREATE rausnehme stürzt niemand mehr ab

Aber das mit den weiteren Hooks interessiert mich trotzdem...