Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Nachricht abfangen - Maushook (https://www.delphipraxis.net/5869-nachricht-abfangen-maushook.html)

OrallY 21. Jun 2003 18:45


Nachricht abfangen - Maushook
 
So, ich habe es jetzt endlich hingekriegt, meinen Maushook zum laufen zu bringen. Jedesmal, wenn irgendwas mit der Maus passiert, schickt meine Hook-DLL meinem Programm eine Nachricht.
Wie kann ich nun verhindern, dass andere Programme auch eine Nachricht erhalten? Also zum Beispiel die WM_MOUSEMOVE-Nachricht abfangen?
Eigentlich sind ja Hooks dazu gemacht, eben dies zu vermeiden. Doch gibt es irgendeine Möglichkeit?

Sharky 22. Jun 2003 16:22

Re: Nachricht abfangen - Maushook
 
Zitat:

Zitat von OrallY
...
Wie kann ich nun verhindern, dass andere Programme auch eine Nachricht erhalten? Also zum Beispiel die WM_MOUSEMOVE-Nachricht abfangen?
Eigentlich sind ja Hooks dazu gemacht, eben dies zu vermeiden. Doch gibt es irgendeine Möglichkeit?

Hai OrallY,

ich kenne mich damit nicht so richtig aus. Aber wäre es eventuell möglich dies über PeekMessage zu lösen?

Duffy 22. Jun 2003 16:41

Hallo OrallY,
wenn Du einen Hook installiert hast, dann bekommst Du die Nachricht als erstes, es sei den jemand anderes installiert einen Hook nach Dir und läßt Dich dumm sterben. "Worm/Bugbear.B" macht das zur Zeit mit einem Trojaner. Also Du hast keine Chance, wenn Dich einer austrickst. Es sei denn, Du nimmst ihn auch wieder den Ball ab.
bye

OrallY 22. Jun 2003 16:54

Kann mir vielleicht einer erklären, wie ich, wenn es die richtige Funktion ist, PeekMessage in meiner DLL einzusetzen habe? So funktioniert es auf jedenfall nicht:
Delphi-Quellcode:
var
   Msg: TMsg;

function MouseHookProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  if code = HC_ACTION then
  begin
    FileMapObj := OpenFileMapping(FILE_MAP_READ, False,'HookMapFile');
    if FileMapObj <> 0 then
    begin
      FileMapView := MapViewOfFile(FileMapObj, FILE_MAP_READ, 0, 0, 0);
      PostMessage(FileMapView^, WM_HOOKMAP, wParam, lParam);
      PeekMessage(Msg, 0, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE or PM_NOYIELD);
      UnmapViewOfFile(FileMapView);
      CloseHandle(FileMapObj);
    end;
  end;
  Result := CallNextHookEx(HookHandle, Code, wParam, lParam);
end;
Der Sinn eines Hooks ist ja die Messages nach verarbeitungen weiterzuleiten. Aber genau das will ich verhindern. Ich will, dass weder ein normales Fenster, noch der Desktop noch irgendein anderes Teil was eine Mausnachricht erhalten kann, sie nicht bekommt.

Duffy 22. Jun 2003 16:58

Hallo OrallY,
dann schmeiß das, was Du bekommen hast einfach weg und Schluß ist.
bye

OrallY 22. Jun 2003 17:20

Ja, klar! Das Problem ist ja nicht das Theoretische, sondern das Prakitsche: Wie schmeiß ich die Nachricht weg?

Duffy 22. Jun 2003 17:24

Hallo OrallY,
ich weiß ja nicht was sie macht,
Delphi-Quellcode:
CallNextHookEx(HookHandle, Code, wParam, lParam);
aber die sollte es glaube ich sein.

[edit=Daniel B]Doppelpost gelsöcht. MfG Daniel B.[/edit]

OrallY 22. Jun 2003 18:32

Diese Prozedur stellt nur sicher, dass andere Hooks ebenfalls noch Nachrichten empfangen. Das hat leider nichts mit der Nachrichtenverarbeitung der Programme zu tun.

Duffy 22. Jun 2003 18:38

Hallo OrallY,
Du reichst aber die Parameter weiter, ohne sie vorher zu manipulieren.
bye

OrallY 23. Jun 2003 15:55

Wie ich schon schrieb hat die CallNextHookEx nur die funktion sicher zu stellen, dass etwaige Hooks, die in der Rangliste unter dem eigenen stehen auch noch die Nachricht erhält. Deswegen hilft weder das weglassen des Befehls noch das Verändern der Parameter der Lösung meines Problems.
Kann mir bitte mal jemand die Verwendung von PeekMessage erklären und was es genau macht. Die englische Erklärung im PSDK habe ich nicht zu genüge verstanden.

OrallY 24. Jun 2003 18:09

Ich muss mich entschuldigen, Duffy. Diese Prozedur ist der Schlüssel! Wenn ich einen WH_MOUSE_LL installiere und die Prozedur ausklammere, geht gar nix mehr mit der Maus.
(Ich hatte das ganze schonmal probiert, aber vergessen die neu kompilierte DLL auch zu benutzen :wall:).
Jetzt muss ich nur noch herausfinden, wie ich es schaffe, dass man die Maus noch bewegen kann :wink: .

Sharky 26. Jun 2003 11:57

Hai Orally,

bist Du bei dieser Sache schon weitergekommen?

Ich finde nämlich keine Lösung :cry:

negaH 27. Jun 2003 11:44

PeekMessage() oder GetMessage() in globalen Hooks sind extrem gefährlich. Einige der Hooks werden nur aufgerufen WEIL man PeekMessage() GetMessage() aufruft. In deinem Falle können als tödliche Rekursionen im Hook entstehen.

Normalerweise sollte man die betreffende Message NICHT mit CallNextHookEx() weiterleiten. Aber, nicht mit jedem Hook funktioniert das. Zudem können die Hooks meistens die Messages auch nicht ändern.

So leid es mit tut, aber es bleiben zwei Lösungen:
1.) VXD/SYS Treiber coden
2.) neben WH_MOUSE noch WH_CALLWNDPROC Hook installieren. Dort die WM_RBUTTONxxxx Messages abfangen, und durch WM_NULL Messages ersetzen.
WH_CALLWNDPROC Hooks können nämlich den Messagerecord manipulieren.

Gruß hagen

OrallY 21. Dez 2003 13:26

Re: Nachricht abfangen - Maushook
 
Kannst du mir das mit WH_CALLWNDPROC bitte ein wenig näher erklären negaH?

OrallY 24. Dez 2003 14:49

Re: Nachricht abfangen - Maushook
 
Ich hab mal grad ein wenig im PSDK geblättert und bin auf folgendes gestoßen:
Zitat:

The CallWndProc hook procedure can examine the message, but it cannot modify it. After the hook procedure returns control to the system, the message is passed to the window procedure.
Das heißt also, dass dieser Hook für mich nicht in Frage kommt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz