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 Fenster anhand Handle subclassen (https://www.delphipraxis.net/49031-fenster-anhand-handle-subclassen.html)

Marphy 4. Jul 2005 16:33


Fenster anhand Handle subclassen
 
Hallo zusammen,
ich möchte ein Fenster "meines" eigenen Prozesses subclassen - habe aber nur dessen Handle... Das hört sich banal an, aber ich bekomme es irgendwie nicht gebacken.

Die WindowProc über GetWindowLong() + GWL_WNDPROC ermitteln ist kein Problem, auch das Setzen einer eigenen WndProc über ein entsprechendes SetWindowLong() nicht. Aber in der eigenen WindowProc selber kracht's dann... Ich hab schon vieles versucht, komme aber nicht weiter. :x

Ich hoffe, ihr könnt mir da aushelfen. Danke dafür schon im Voraus! :thumb:

Gruß, Marco

Luckie 4. Jul 2005 16:49

Re: Fenster anhand Handle subclassen
 
Zitat:

Zitat von Marphy
Aber in der eigenen WindowProc selber kracht's dann... Ich hab schon vieles versucht, komme aber nicht weiter. :x

Und genau an dieser Stelle habe ich eigentlich etwas Quellcode erwartet. :roll:

Olli 4. Jul 2005 19:53

Re: Fenster anhand Handle subclassen
 
Der Source der Fensterfunktion wäre hier wichtig.

Ansonsten geht es etwa so:
Delphi-Quellcode:
SetWindowLong(hwnd, GWL_USERDATA, SetWindowLong(hwnd, GWL_WNDPROC, @WndProc));
Wir bekommen damit in user data die Adresse der ursprünglichen Fensterfunktion, wobei die neue direkt damit gesetzt wird.

Das Defaulthandling übernimmt dann in deiner WndProc die alte Fensterfunktion dank:
Delphi-Quellcode:
result := CallWindowProc({hier muß ein Cast hin ->}GetWindowLong(hwnd, GWL_USERDATA), ...);
Habe den o.g. Cast nicht im Kopf, sorry. Wahrscheinlich "Pointer()" ...?!

Nachtrag:
Du kannst die beiden obigen Aufrufe von SetWindowLong() auch aufdröseln, damit es threadsafe wird. Dazu müßtest du dann wohl sowas hier machen:
Delphi-Quellcode:
SetWindowLong(hwnd, GWL_USERDATA, GetWindowLong(hwnd, GWL_WNDPROC));
SetWindowLong(hwnd, GWL_WNDPROC, @WndProc);
Statt GWL_USERDATA kannste auch was anderes sinnvolles oder z.B. SetProp/GetProp benutzen.

Noch'n Nachtrag:
Wahrscheinlich MUSST du sogar die letzte Variante nehmen, weil beim geschachtelten SetWindowLong() der Fall eintreten könnte, daß deine eigene Funktion gesetzt ist und durch eine externe Message aufgerufen wird, während der Wert in GWL_USERDATA (oder wo auch immer) noch nicht gesetzt ist. Dieser wird aber benötigt, damit die alte Fensterfunktion aufgerufen werden kann.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:04 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