AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) lokaler Hook wird immer doppelt durchlaufen?

lokaler Hook wird immer doppelt durchlaufen?

Ein Thema von r29d43 · begonnen am 30. Apr 2016 · letzter Beitrag vom 2. Mai 2016
Antwort Antwort
Seite 1 von 2  1 2   
r29d43

Registriert seit: 18. Jan 2007
276 Beiträge
 
Delphi 10.4 Sydney
 
#1

lokaler Hook wird immer doppelt durchlaufen?

  Alt 30. Apr 2016, 14:10
Hallo, weil ich seit langem mal wieder einen lokalen Hook brauche, konstruierte ich mir erstmal einen solchen in Form eines quasi simpelst möglichen getMsg-Hooks. Allerdings habe ich bei dem jetzt das kuriose Prob, dass alle Messages, die an das Panel1 gehen und auf dem ich mit der Maus jetzt gerade herumklicke, diesen Hook irgendwie doppelt durchlaufen, also dann auch in der Case-Anweisung im Code doppelt gezählt werden.

Delphi-Quellcode:
function GetMsgProc (nCode: Integer; wParam, lParam: Longint): Longint; stdcall;
type MSG = record
       hwnd : HWND;
       message : UINT;
       wParam : DWord;
       lParam : DWord;
       time : DWORD;
       pt : TPOINT;
     end;
     PMSG = ^MSG;
begin
{ }
  if nCode = HC_ACTION
// if not nCode < 0
  then begin

    with form4 do
    if PMSG(lParam)^.hwnd = Form4.panel1.handle then
    case PMSG(lParam)^.message of
      WM_LBUTTONDOWN :
                       begin
                         inc(LButtonDownCounter);
                         label1.caption := IntToStr(LButtonDownCounter)
                       end;
      WM_LBUTTONUP :
                       begin
                         inc(LButtonUpCounter);
                         label2.caption := IntToStr(LButtonUpCounter)
                       end;
      WM_LBUTTONDBLCLK :
                       begin
                         inc(DoppelklickCounter);
                         label3.caption := IntToStr(DoppelklickCounter)
                       end;
    end; { of case }
  end;

  Result := CallNextHookEx(Form4.HookID, nCode, wParam, lParam);
end;


procedure TForm4.FormCreate(Sender: TObject);
begin
  HookID := SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc , 0, GetCurrentThreadId());
  LButtonDownCounter := 0;
  LButtonUpCounter := 0;
  DoppelklickCounter := 0;
end;


procedure TForm4.FormDestroy(Sender: TObject);
begin
  if HookID <> 0 then UnHookWindowsHookEx(HookID);
end;

Irgendwo muss hier doch noch ein winzig kleiner Fehler stecken, nur wo?
(leider habe ich gerade 2 dicke Tomaten auf den Augen).
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: lokaler Hook wird immer doppelt durchlaufen?

  Alt 30. Apr 2016, 16:35
Kann auf den ersten Blick auch keinen Fehler sehen. Aber warum verwendest du überhaupt MSDN-Library durchsuchenSetWindowsHookEx? Das ist doch für einen lokalen Hook etwas mit Kanonen auf Spatzen geschossen.

Für die gezeigten Aktionen könntest du doch einfach die entsprechenden Events des Panels (OnDblClick, OnMouseDown, OnMouseUp, etc) nutzen. Wenn du mehr Messages brauchst, wäre die saubere Lösung eine eigene Panel Klasse vom TCustomPanel abzuleiten. Alternativ könntest du auch Subclassing verwenden, um die WndProc lokal umzubiegen.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
r29d43

Registriert seit: 18. Jan 2007
276 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: lokaler Hook wird immer doppelt durchlaufen?

  Alt 30. Apr 2016, 17:11
Thx für die Anregung, aber der von mir angezeigte Code war ja nur ein einfachst mögliches Testprog, um den lokalen Hook für mich intern jetzt erstmal wieder kurz reaktiviert zu haben. Nachher möchte ich so einen Hook für ein Programm nutzen, das aus vielen Formularen besteht, und wo ich mittels des Hooks dann alle Positionsänderungen dieser einzelnen Formulare mittels wm_move o. wm_moving kontrollieren (protokollieren, speziell verändern o. ganz verhindern) kann.

Außerdem geht's mir hier auch noch ein kleines bisschen ums Prinzip. So ein Hook hatte bei mir bisher nämlich eigentlich immer ganz gut geklappt, und jetzt auf einmal nicht mehr? Warum???
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
9.844 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: lokaler Hook wird immer doppelt durchlaufen?

  Alt 30. Apr 2016, 17:22
Ist sicher gestellt, daß TForm4.FormCreate nicht zweimal aufgerufen wird?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: lokaler Hook wird immer doppelt durchlaufen?

  Alt 30. Apr 2016, 17:28
So ein Hook hatte bei mir bisher nämlich eigentlich immer ganz gut geklappt, und jetzt auf einmal nicht mehr? Warum???
Bei mir tritt das selbe Problem auf. Wenn ich testweise aber mal direkt das Formular überwache, dann kommen die Messages bei Click auf die Client-Area ebenfalls doppelt an. Clicks in die Titelleiste allerdings nur einmal.

Ich vermute mal, dass die VCL da intern irgendwie mit den Messages hantiert und dadurch verursacht, dass diese manchmal doppelt verschickt werden.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
r29d43

Registriert seit: 18. Jan 2007
276 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: lokaler Hook wird immer doppelt durchlaufen?

  Alt 30. Apr 2016, 18:00
Zitat:
Ist sicher gestellt, daß TForm4.FormCreate nicht zweimal aufgerufen wird?
Das sollte eigentlich nicht passiert sein. Und da Zacherl den Code auchmal kurz gestest hat, hätte er ja quasi einen solchen gleichen Fehler auch gemacht, was wohl ziemlich unwahrscheinlich sein dürfte.

Zitat:
Bei mir tritt das selbe Problem auf. Wenn ich testweise aber mal direkt das Formular überwache, dann kommen die Messages bei Click auf die Client-Area ebenfalls doppelt an. Clicks in die Titelleiste allerdings nur einmal.

Ich vermute mal, dass die VCL da intern irgendwie mit den Messages hantiert und dadurch verursacht, dass diese manchmal doppelt verschickt werden.
Ersteres kann ich bestätigen. Die LButtonUp-Message wird beim Klick auf die Titelleiste auch nur 1 mal gezählt (die LButtonDown-Message 0 mal). Bezüglich der Verursachung dieses Effektes glaube ich allerdings eher an eine irgendwie eigene Verursachung. Ansonsten wäre so eine imo dicke Fehlersache doch sicher schon längst bekannt und behoben worden.

Geändert von r29d43 (30. Apr 2016 um 22:44 Uhr)
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#7

AW: lokaler Hook wird immer doppelt durchlaufen?

  Alt 30. Apr 2016, 22:52
Zitat:
Ist sicher gestellt, daß TForm4.FormCreate nicht zweimal aufgerufen wird?
Das sollte eigentlich nicht passiert sein. Und da Zacherl den Code auchmal kurz gestest hat, hätte er ja quasi einen solchen gleichen Fehler auch gemacht, was wohl ziemlich unwahrscheinlich sein dürfte.
Sollte, hätte und dürfte ist Konjunktiv II. Entscheidend ist hier aber nur der Indikativ.

Mit z.B. einem simplen

showmessage('TForm4.FormCreate')

oder einem Piepton mit Zufallsfrequenz

windows.beep(200+random(1000),100)

irgendwo in der FormCreate-Prozedur ließe (huch, Konjunktiv II) sich das einfach verifizieren oder falsifizieren. Dann könnte (huch, schon wieder Konjunktiv II) man auch auf den Konjunktiv II in den Antworten verzichten.

Geändert von Delphi-Laie (30. Apr 2016 um 23:01 Uhr)
  Mit Zitat antworten Zitat
r29d43

Registriert seit: 18. Jan 2007
276 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: lokaler Hook wird immer doppelt durchlaufen?

  Alt 1. Mai 2016, 00:42
Damit auch für die Grammatikprofis alle Zweifel restlos ausgeräumt sind: Es blieb bei nur einem Meldungsfenster bzw. auch bei nur einem Ton.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#9

AW: lokaler Hook wird immer doppelt durchlaufen?

  Alt 1. Mai 2016, 00:49
Damit auch für die Grammatikprofis alle Zweifel restlos ausgeräumt sind: Es blieb bei nur einem Meldungsfenster bzw. auch bei nur einem Ton.
Na, das ist doch eine klare - indikative! - Ansage, warum nicht gleich so?

Das waren nur zwei Beispiele, wie man schnell - ohne Debugger - das Durchlaufen von Code feststellen kann, ich benutze derlei jedenfalls ziemlich oft. Vielleicht gibt es noch mehr und geeignetere Methoden?!
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
9.844 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: lokaler Hook wird immer doppelt durchlaufen?

  Alt 1. Mai 2016, 09:50
Hast du schon mal einen Haltepunkt gesetzt und den Aufruf-Stack angeschaut?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf