Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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.

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

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.

  • Autor

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

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

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.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.