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