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 1. Mai 2016
Antwort Antwort
Seite 2 von 2     12
r29d43

Registriert seit: 18. Jan 2007
287 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: lokaler Hook wird immer doppelt durchlaufen?

  Alt 1. Mai 2016, 15:07
Hast du schon mal einen Haltepunkt gesetzt und den Aufruf-Stack angeschaut?
Thx für den Tipp, der brachte was. Denn da sah ich auf einmal, wie bei den einzelnen Hookbesuchen ständig zwischen 0 und 1 wechselnde Werte im wParameter-Parameter auftauchten. Gemäß der MSDK beinhaltet dieser wParameter die Information darüber, ob die Message schon von der Message-Schlange entfernt wurde oder ob nicht. (Das hatte ich bisher einfach als eher unwichtig ignoriert).

Demgemäß scheint es also doch normal zu sein, dass zumindest eine GetMsgProc bei jeder Message zweimal aufgerufen wird. Nämlich einmal mit der Message wo diese noch nicht von der Message-Schlange heruntergenommen wurde, und ein zweites Mal wo das schon geschehen ist und wo diese Message dann anschließend (nach der Hook-Kette) direkt zur WndProc des Control weitergeschickt werden wird.

Soll heißen (zumindest für mich): Wenn man auf eine Message in so einer GetMsgProc reagieren möchte, dann muss man also auch diesen wParameter noch mit berücksichtigen und kann so auch nochmal ein bisschen genauer auf die Situation reagieren ...schon bei einer angänglichen Vorab-Betrachtung der Message, bevor die überhaupt schon abgeschickt wurde, oder erst danach wenn fest steht, dass sie tatsächlich zum Control abgeschickt wurde etc. etc..

Zacherl lag also doch schon irgendwo richtig mit seiner Vermutung
Zitat:
Ich vermute mal, dass die VCL da intern irgendwie mit den Messages hantiert und dadurch verursacht, dass diese manchmal doppelt verschickt werden.
nur anstatt "manchmal" eben wahrscheinlich immer (im oben erwähnten Kontext).

Geändert von r29d43 ( 1. Mai 2016 um 18:06 Uhr)
  Mit Zitat antworten Zitat
r29d43

Registriert seit: 18. Jan 2007
287 Beiträge
 
Delphi 10.4 Sydney
 
#12

AW: lokaler Hook wird immer doppelt durchlaufen?

  Alt 1. Mai 2016, 23:05
Vielleicht noch eine kleine Ergänzung dazu:

Diese pro einer Message doppelten Hook-Aufrufe gibts auch noch bei einigen anderen lokalen Hooks. Zum Beispiel auch beim lokalen Mouse-Hook (den ich bisher immer nutzte). Bei diesem war mir nur bisher noch nicht aufgefallen, weil der von mir irgendwoher kopierte Code zur Message-Bearbeitung mit <if nCode = HAction then> begann (und im MouseHook das Info, ob die Message schon von der MsgLoop gelöscht wurde, schon im 'nCode'-Parameter sitzt). Das nämlich lässt den Hook-Durchlauf mit noch nicht von der Message-Loop gelöschten Message außen vor. Den würde man bekommen mit <if nCode = HC_NOREMOVE then>. Und wenn man die Message-Bearbeitung im Mouse-Hook mit <if nCode >= 0 then> beginnt, dann bearbeitet man auch beim Mouse-Hook tatsächlich beide Hook-Durchläufe pro Message. Auch beim Keyboard-Hook (WH_KEYBOARD) dürfte das so ganz ähnlich liegen.

Ob es so einen doppelten Hookdurchlauf pro Message überhaupt gibt hängt davon ab, ob beim Auslesen der Message die Api-Funktionen GetMessage oder PeekMessage beteiligt sind (dann wird der Hook vom System aufgerufen) und ob die Application zum Abgreifen dieser Message von der MsgLoop dafür z.B. 2 PeekMessage-Calls benutzt. Einen ohne die Message dabei zu löschen, und einen zweiten mit Message-Löschung und anschließend dann wohl Weiterleitung an die WndProc des jeweiligen Controls (...so +/- gemäß MSDK).

Last but not least: Wer oben event. mitgelesen hat weiß, dass es mir hier letztlich um die wm_move und wm_moving -Messages ging. Messages, die man jetzt aber zufälligerweise garnicht durch einen GetMsg-Hook bekommt, sondern wofür man einen lokalen CallWnd-Hook (WH_CALLWNDPROC) benötigt.

(Das nur der Vollständigkeit halber, weil's bei vielen sicher ähnlich liegt wie bei mir: Einen 'perfekten' schönen Code aus dem Internet kopiert und deswegen an dieser Sache nie vorbeigekommen )

Geändert von r29d43 ( 2. Mai 2016 um 09:47 Uhr)
  Mit Zitat antworten Zitat
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 10:34 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