Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Komponente mit PostMessage TService-tauglich machen (https://www.delphipraxis.net/214954-komponente-mit-postmessage-tservice-tauglich-machen.html)

Hobbycoder 10. Apr 2024 18:05

Komponente mit PostMessage TService-tauglich machen
 
Hi,
ich habe eine (Fremd)-Komponente, die, basieren auf TComponent sich ein WindowHandle holt und verschiendene Event über PostMessage feuert.
Diese Komponente möchte ich jetzt in einem Service bzw. in einem Thread einsetzen. Als Thread kann er sich aber kein WindowHandle holen (wenn's nicht stimmt bitte korrigiert mich).

Nun dachte ich mir, stell ich das einfach um auf PostThreadMessage. Statt eines WindowHandle hole ich mir einfach die ThreadID und brauch lediglich aus PostMessage->PostThreadMessage machen.
Was mir natürlich fehlt ist die WndProc, die ja, wenn ich das ganze richtig verstanden habe, im Thread nicht geht.
Also muss die Message über GetMessage oder PeekMessage in einer Schleife abgeholt werden. Dazu muss ich das der Execute-Methode unterbringen, richtig? Oder gibt es eine Möglichkeit sich innerhalb der Komponente in irgendeine MessageQueue einzuklinken?

Ich muss dazu sagen, dass ich mit PostThreadMessage und so noch nie was gemacht habe. Immer nur mit WindowMessages. Vielleicht könnte ihr mich ein wenig erhellen.

himitsu 10. Apr 2024 19:30

AW: Komponente mit PostMessage TService-tauglich machen
 
Was für ein Handle?
Warum nicht TWinControl, wenn es ein Handle HWND verwaltet?

Zitat:

Zitat von Hobbycoder (Beitrag 1535600)
Also Server kann er sich aber kein WindowHandle holen (wenn's nicht stimmt bitte korrigiert mich).

Ich sag es mal so, der Windows-Service baut intern auf der VCL auf. :angle2:

Doch, Messages in Threads gehen, wenn jemand (DU) die Messages auch verarbeitet. (GetMessage bzw. PeekMessage)
Handle/HWND müssen auch in dem Thread erstellt (CreateWindow) werden, wo sie verarbeitet werden sollen.

Beim ersten Aufruf einer Message-Funktion (z.B. CreateWindow/GetMessage/PeekMessage) wird automatisch eine MessageQueue für diesen Thread erzeugt.

Und PostThreadMessage sendet direkt an den Thread, nicht an ein WinControl, also wird es auch vom keinem WinControl/WndProc empfangen/verarbeitet.
DU mußt es also in deiner Message-Verarbeitung (GetMessage bzw. PeekMessage) deine Message abfangen und verarbeiten. (in der VCL kann man sich auch an Application.OnMessage TApplicationEvents.OnMessage hängen)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:12 Uhr.

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