SetWindowsHookEx Thread-Problem



  • Hallo,

    ich habe folgenden Code:

    int main(int argc,char**argv){
    	HHOOK handle={0};
    	HWND window_handle={0};
    	unsigned int ID={0};
    	Module hook_DLL("\\DLL\\main.dll");
    	while((window_handle==0)){
    		window_handle=f_FindWindow(0,"Fenster");
    		Sleep(250);
    	};
    	ID=GetWindowThreadProcessId(window_handle,0);
    	handle=SetWindowsHookEx(WH_CALLWNDPROC,hook_DLL.address<HOOKPROC>("CallWndProc@12"),hook_DLL.get(),ID);
    	console<<GetLastError(); // gibt 0 zurück
    	while((IsWindow(window_handle)!=0)&&(handle!=0)){
            // läuft solange das Fenster existiert
    		Sleep(250);
    	};
    	UnhookWindowsHookEx(handle);
    	return 0;
    };
    

    und folgende DLL:

    extern "C" declspec(dllexport)int WINAPI CallWndProc(int code,unsigned int wParam,int lParam){
    	///
    	char buffer[50]={0};
    	CWPSTRUCT*cwp={reinterpret_cast<CWPSTRUCT*>(lParam)};
    	std::fstream static fs("C:\\hier_bin_ich.log",std::ios::in|std::ios::out|std::ios::trunc);
    	if((code<0)){
    		return f_CallNextHookEx(0,code,wParam,lParam);
    	};
    	SendMessage(cwp->hwnd,WM_GETTEXT,sizeof(buffer),reinterpret_cast<int>(buffer));
    	fs<<buffer<<"\n";
    	fs<<std::hex<<cwp->message<<"\n\n";
    	return f_CallNextHookEx(0,code,wParam,lParam);
    };
    

    Wieso wird hier keine "hier_bin_ich.log"-Datei erstellt bzw. warum wird "CallWndProc" nicht aufgerufen?
    Lasse ich beim main-Code statt der Thread-ID eine 0, dann bekomme ich zwar eine Datei ("hier_bin_ich.log"), doch in der bekomme ich Messages von Windows Media Player (habe ich öfters im Hintergrund offen) und keine von dem Fenster "Fenster". Was habe ich falsch gemacht?

    Übrigens: Meine Klasse "Module" wendet "LoadLibrary()", die Funktion "address<T>" wendet "GetProcAddress" an und "get" gibt die Instanz (HMODULE) von der DLL zurück.

    Danke im Voraus!

    MfG
    Seikuassi

    P.S.: Was ich machen will, ist wahrscheinlich klar: Ich möchte mittels DLL-Injecting Windows-Message verarbeiten, bevor ich diese der eigentlichen Prozedur überlasse (nicht für "schadhaftes" Hacken).



  • Hat keiner eine Antwort auf Lager?

    Wie würdet Ihr denn die Nachrichten eines Fensters (von einem fremden Prozess) auslesen wollen bzw. wie würdet Ihr es machen?



  • Welchen Rückgabewert hat SetWindowsHookEx?



  • Hallo happystudent,

    der Rückgabewert lautet hier mal "0x190285", mal "0x300137" etc.

    MfG

    Seikuassi



  • Hallo,

    ich bin jetzt ein bischen weiter gekommen, aber ich habe wieder Probleme:

    main.cpp:

    HND inject=LoadLibrary("inject.dll");
    HHOOK hook_handle=SetWindowsHookEx(4,reinterpret_cast<HookProc>(inject,"Hook_Proc"),inject,GetWindowThreadProcessId(FindWindow(0,"Mozilla Firefox"),0));
    if((hook_handle==0)){
       std::cout<<"Hook konnte nicht installiert werden.";
       return 1;
    };
    MSG msg;
    while((GetMessage(&msg,0,0,0)>0));
    UnhookWindowsHookEx(hook_handle);
    FreeLibrary(inject);
    

    inject.cpp

    extern "C" __declspec(dllexport) LRESULT WINAPI Hook_Proc(int code,WPARAM wParam,LPARAM lParam){
       if((code>=0)){
          CWPSTRUCT*cwp=reinterpret_cast<CWPSTRUCT*>(lParam);
          if((cwp->message==WM_DESTROY)||(cwp->message==WM_CLOSE)||(cwp->message==WM_QUIT)){
             PostQuitMessage(0);
          };
       };
       return CallNextHookEx(0,code,wParam,lParam);
    };
    

    Wenn ich die beiden Mouse- bzw. Keyboardhooks nehme, funktioniert es (allerdings nicht mit WM_DESTROY etc.).
    Wo liegt der Fehler bzw. was muss ich ändern?

    MfG

    Seikuassi


Log in to reply