AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Fenster anhand Handle subclassen
Thema durchsuchen
Ansicht
Themen-Optionen

Fenster anhand Handle subclassen

Ein Thema von Marphy · begonnen am 4. Jul 2005 · letzter Beitrag vom 4. Jul 2005
Antwort Antwort
Marphy

Registriert seit: 24. Feb 2005
162 Beiträge
 
Delphi 7 Professional
 
#1

Fenster anhand Handle subclassen

  Alt 4. Jul 2005, 16:33
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.

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

Gruß, Marco
Marco
Wo ein Wille ist, ist auch ein Weg. Aber wo ein Weg ist, ist nicht unbedingt auch ein Wille...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Fenster anhand Handle subclassen

  Alt 4. Jul 2005, 16:49
Zitat von Marphy:
Aber in der eigenen WindowProc selber kracht's dann... Ich hab schon vieles versucht, komme aber nicht weiter.
Und genau an dieser Stelle habe ich eigentlich etwas Quellcode erwartet.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#3

Re: Fenster anhand Handle subclassen

  Alt 4. Jul 2005, 19:53
Der Source der Fensterfunktion wäre hier wichtig.

Ansonsten geht es etwa so: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: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.
  Mit Zitat antworten Zitat
Antwort Antwort


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: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