Guybrush Threepwood Geschrieben 18. Februar 2003 Geschrieben 18. Februar 2003 Hi, kann mir einer von euch bei folgendem Programm helfen? Ich habe versucht einen Systemweiten Hook anzulegen und wenn die Linke Maustaste gedrückt wird soll sich mein Programm beenden. Nur leider erhält mein Programm keine Nachrichten. Hier mal der Code: #include <windows.h> LRESULT CALLBACK HookProc(HWND, UINT, WPARAM, LPARAM); HHOOK hHook; APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG Msg; hHook = SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)HookProc,hInstance,0); if (hHook == NULL) DWORD d=GetLastError(); while(GetMessage(&Msg,0,0,0)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } return Msg.wParam; } LRESULT CALLBACK HookProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { switch(Msg) { case WM_LBUTTONDOWN: { UnhookWindowsHookEx(hHook); PostQuitMessage(0); return 0; } } return 0; } [/PHP] Ich glaube es fehlt die Verbindung von GetMessage() zu meiner HOOKPROC, nur leider weiß ich nicht wie ich die herstellen soll. Gruß Guybrush Zitieren
Klotzkopp Geschrieben 18. Februar 2003 Geschrieben 18. Februar 2003 Erstens ist die Signatur deiner HookProc falsch. HookProcs sind LRESULT CALLBACK HookProc(int, WPARAM, LPARAM); Dann ist auch der Cast nicht mehr notwendig. Zweitens müssen globale Hooks in DLLs stehen, denn die anderen Prozesse kommen sonst nicht an den Code. Zitieren
Guybrush Threepwood Geschrieben 18. Februar 2003 Autor Geschrieben 18. Februar 2003 Originally posted by Klotzkopp Erstens ist die Signatur deiner HookProc falsch. HookProcs sind LRESULT CALLBACK HookProc(int, WPARAM, LPARAM); Die Procedure hab ich eben auch gesehen, aber da hab ich noch das Problem das LPARAM ein Zeiger auf ein CWPSTRUCT sein soll. Nur wie greife ich dann auf die einzelnen Teile der Struktur über den LPARAM Zeiger zu? Zweitens müssen globale Hooks in DLLs stehen, denn die anderen Prozesse kommen sonst nicht an den Code. Warum müssen die denn an meinen Code? Ich hab das mit den Hooks irgendwie noch nicht so ganz verstanden. Zitieren
Klotzkopp Geschrieben 18. Februar 2003 Geschrieben 18. Februar 2003 Originally posted by Guybrush Threepwood Nur wie greife ich dann auf die einzelnen Teile der Struktur über den LPARAM Zeiger zu? PCWPSTRUCT pcwp = reinterpret_cast<PCWPSTRUCT>( lParam ); if( pcwp->message == WM_LBUTTONDOWN ... Warum müssen die denn an meinen Code?Wenn du einen globalen Hook für WH_CALLWNDPROC einrichtest, ruft die WndProc eines jeden Prozesses deinen Hook auf. Was passiert, wenn dazu ein Funktionszeiger benutzt wird, der nur im Adressraum deines Prozesses gültig ist, kannst du dir ausmalen: Jeder Prozess mit einer WndProc, außer deinem, schmiert mit einer Schutzverletzung ab. Im günstigsten Fall. Wenn der Code aber in einer DLL steht, deren Instance-Handle du ja angibst, kann jeder Prozess auf die Adresse zugreifen. Noch was: Am Ende deiner HookProc musst du CallNextHookEx aufrufen, und den Rückgabewert zurückgeben. Sonst kommen andere, vorher eingerichtete Hooks nicht mehr zum Zuge. Zitieren
Guybrush Threepwood Geschrieben 18. Februar 2003 Autor Geschrieben 18. Februar 2003 Ok, ich versuchs mal. Vielen Dank! Gruß Guybrush Zitieren
Guybrush Threepwood Geschrieben 18. Februar 2003 Autor Geschrieben 18. Februar 2003 Ich hab mal ein bischen rumprobiert, steh aber irgendwie noch auf dem Schlauch:( Mein Programm das den Hook anlegt sieht jetzt so aus: MSG Msg; DWORD d; HINSTANCE hHookInst = LoadLibrary("c:\\HookDll.dll"); if (hHookInst == NULL) d=GetLastError(); FARPROC HookProc = GetProcAddress(hHookInst,(LPSTR)MAKEWORD(1,0)); if (HookProc == NULL) d=GetLastError(); hHook = SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)HookProc,hHookInst,0); if (hHook == NULL) d=GetLastError(); while(GetMessage(&Msg,0,0,0)) { TranslateMessage(&Msg); } return Msg.wParam; [/PHP] Die HookProc wird von der DLL exportiert, konnte aber komischerweise nur per Ordinal Nummer gefunden werden. Die Pocedur sieht so aus: [PHP] HOOKDLL_API LRESULT CALLBACK HookProc(int nCode ,WPARAM wParam,LPARAM lParam) { pcwp = reinterpret_cast<PCWPSTRUCT>(lParam); switch(pcwp->message) { case WM_LBUTTONDOWN: { MessageBox(0,"OK","OK",MB_APPLMODAL); return 0; } } return 0; } Bei einem Mausklick wird aber keine MessageBox geöffnet. Wie soll ich denn CallNextHookEx() aufrufen? In der Exe hab ich die Nachricht nicht und in der DLL nicht das Handle zum Hook. Muß ich das Handle extra an die DLL übergeben? Gruß Guybrush Zitieren
Klotzkopp Geschrieben 18. Februar 2003 Geschrieben 18. Februar 2003 Originally posted by Guybrush Threepwood Die HookProc wird von der DLL exportiert, konnte aber komischerweise nur per Ordinal Nummer gefunden werden.Hast du die Funktion als extern "C" deklariert? Wenn nicht, wird der Name dekoriert. Das kannst du dir mit Depends ansehen. Bei einem Mausklick wird aber keine MessageBox geöffnet.Versuchs mal mit einem Hook für WH_MOUSE_LL, das müsste gehen. In der Exe hab ich die Nachricht nicht und in der DLL nicht das Handle zum Hook. Muß ich das Handle extra an die DLL übergeben?Entweder das, oder SetWindowsHookEx gleich in der DLL ausführen. Zitieren
Guybrush Threepwood Geschrieben 18. Februar 2003 Autor Geschrieben 18. Februar 2003 Ich hab das jetzt mal alles in die DLL gesteckt und exportiere dort ein Funktion die den Hook erstellt. Muß meine Exe jetzt weiter im Hintergrund laufen oder läuft die DLL nach ihrem Aufruf auch ohne die Exe weiter? WH_MOUSE_LL wird nur von Windows NT unterstützt, ich hab hier aber Win98SE, also habe ich WH_MOUSE genommen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.