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...


Anmelden zum Antworten