Zum Inhalt springen

Message Hooks


Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...