![]() |
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 |
Re: Fenster anhand Handle subclassen
Zitat:
|
Re: Fenster anhand Handle subclassen
Der Source der Fensterfunktion wäre hier wichtig.
Ansonsten geht es etwa so:
Delphi-Quellcode:
Wir bekommen damit in user data die Adresse der ursprünglichen Fensterfunktion, wobei die neue direkt damit gesetzt wird.
SetWindowLong(hwnd, GWL_USERDATA, SetWindowLong(hwnd, GWL_WNDPROC, @WndProc));
Das Defaulthandling übernimmt dann in deiner WndProc die alte Fensterfunktion dank:
Delphi-Quellcode:
Habe den o.g. Cast nicht im Kopf, sorry. Wahrscheinlich "Pointer()" ...?!
result := CallWindowProc({hier muß ein Cast hin ->}GetWindowLong(hwnd, GWL_USERDATA), ...);
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:
Statt GWL_USERDATA kannste auch was anderes sinnvolles oder z.B. SetProp/GetProp benutzen.
SetWindowLong(hwnd, GWL_USERDATA, GetWindowLong(hwnd, GWL_WNDPROC));
SetWindowLong(hwnd, GWL_WNDPROC, @WndProc); 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 20:44 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