Entwickler-Ecke
Windows API - SetWindowText hooken ?
retnyg - Mo 09.12.02 20:47
Titel: SetWindowText hooken ?
Gibt es einen Hook oder ähnliches, mit dem ich den Api-Call SetWindowText "capturen" kann, und ich das Handle des Fensters sowie den Text auslesen kann ?
Danke für Hinweise !
Retnyg
Delete - Di 10.12.02 02:02
Ist mir nicht bekannt. Was willst du denn machen?
retnyg - Di 10.12.02 10:13
Ich möchte z.b. jedesmal wenn sich die Caption der Titelleiste des Internet Explorers oder jedes beliebigen Programmes ändert, diesen Wert abfangen und überschreiben - z.b. statt "AUQ.de :: Antwort schreiben - Microsoft Internet Explorer" "AUQ.de :: Antwort schreiben - MicroLame IE"
gruss retnyg
Delete - Di 10.12.02 10:22
Sorry, macht für mich wenig bis gar keinen Sinn.
retnyg - Di 10.12.02 10:26
Ob es Sinn macht oder nicht ist doch egal !
Es wäre generell interessant eine Möglichkeit zu haben alle API-Calls "mitzuschneiden" um dann bei gewissen Ereignissen etwas zu tun.
wäre sehr hilfreich für die API Programmierung, um Fehler zu erkennen bzw die Arbeitsweise zu durchschauen.
mfg Retnyg
DaFox - Mi 11.12.02 00:00
Hi!
Es ist möglich, ich habe solche Lösungen schon gesehen.
Du musst in diesem Fall die Funktion SetWindowText (aus user32.dll) mit Deiner eigenen ersetzen (in allen Modulen).
Ablauf (in etwa)
1. Liste der Module ermitteln
2. Importabschnitt des Moduls ermitteln (ImageDirectoryEntryToData(Ex))
3. Importdeskriptor suchen, der die Referenz auf die Funktionen des aufrufenden Moduls (user32.dll) enthält
4. Funktion suchen (in diesem Fall SetWindowText)
5. Wenn gefunden, Adresse im Importabschnitt mit unserer neuen überschreiben (WriteProcessMemory)
Alles in allem sehr viel Aufwand um den Text einer Caption Bar zu verändern. :wink:
Ich selbst habe das bisher in Delphi noch nie realisiert, sondern nur Beispiele in C++ gesehen.
Gruß,
Markus
DeCodeGuru - Mi 11.12.02 12:54
Hi retnyg,
wenn du nur willst, dass anstatt "AUQ.de :: Antwort schreiben - Microsoft Internet Explorer" "AUQ.de :: Antwort schreiben - MicroLame IE" steht, kannst du das doch einfach in der Registry ändern. Beispiel is hier im Forum. Musste einfach mal im Forum suchen. :wink:
OregonGhost - Mi 11.12.02 15:51
Wenn das betreffende Programm statt SetWindowText aber einfach WM_SETTEXT verwendet siehst du mit der oben genannten Methode aber alt aus ;c)
Du könntest auch, anstatt SetWindowText zu ersetzen, die Fensterprozedur des betreffenden Fensters ersetzen, in dieser auf WM_SETTEXT prüfen und alles andere an die Originalfensterprozedur weiterleiten.
retnyg - Do 12.12.02 21:13
hört sich gut an, oregonghost, aber wie geht das ?
mfg
Retnyg
DaFox - Fr 13.12.02 13:12
SetWindowLong()
Gruß,
Markus
Delete - Fr 13.12.02 13:18
Aber nicht unter Win2000/XP. Da funktioniert unter Windows2000/XP nur, wenn sich der Funktionsaufruf im gleichen Prozess befindet. Ansonsten mußt du es in einer DLL machen und diese in den fremden Prozess injizieren.
DaFox - Fr 13.12.02 14:19
Hi Luckie!
Vollkommen richtig, ich habe das absichtlich verschwiegen... :wink:
Ich halte diese Methode nämlich nicht für angebracht.
Ich gehe mal von mir aus:
Ich habe (regelmäßig) bis zu 10 Fernster (Instanzen) vom IE geöffnet, das bedeutet doch, dass ich 10 Fenster subclassen muss. Wie bekomme ich effektiv raus, wann eine neue Instanz geöffnet wurde? Wie gewährleiste ich, dass sofort beim Öffnen "mein Text" in der Caption Bar steht?
Da finde ich es effektiver einfach bestimmte Funktionen (SetWindowText, SendMessage,...) zu "hijacken", was bestimmt auch weniger das System belastet, oder nicht?
Gruß,
Markus
Motzi - Fr 13.12.02 14:29
| Luckie hat folgendes geschrieben: |
| Aber nicht unter Win2000/XP. Da funktioniert unter Windows2000/XP nur, wenn sich der Funktionsaufruf im gleichen Prozess befindet. Ansonsten mußt du es in einer DLL machen und diese in den fremden Prozess injizieren. |
Meiner Meinung nach auch unter Win9x! Schließlich lauft dort auch jeder Prozess in seinem eigenen Adressraum und hat keinen (oder kaum und wenn dann keinen direkten) Zugriff auf Daten in anderen Adressräumen..!
| Zitat: |
Ich habe (regelmäßig) bis zu 10 Fernster (Instanzen) vom IE geöffnet, das bedeutet doch, dass ich 10 Fenster subclassen muss. Wie bekomme ich effektiv raus, wann eine neue Instanz geöffnet wurde? Wie gewährleiste ich, dass sofort beim Öffnen "mein Text" in der Caption Bar steht?
Da finde ich es effektiver einfach bestimmte Funktionen (SetWindowText, SendMessage,...) zu "hijacken", was bestimmt auch weniger das System belastet, oder nicht? |
Nun ich denke mal das lässt sich mit SetClassLong machen.. nicht einfach jedes IE-Fenster subclassen, sondern gleich die gesamte Fensterklasse des IE.. aber nichtsdestotrotz finde ich das ganze Vorhaben mehr als unnötig..
DaFox - Fr 13.12.02 14:39
SetClassLong :shock:
Stimmt, das ist eine ernstzunehmende Alternative :wink:
Gruß,
Markus
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!