Autor |
Beitrag |
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Mo 09.12.02 21:47
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
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 10.12.02 03:02
Ist mir nicht bekannt. Was willst du denn machen?
|
|
retnyg 
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Di 10.12.02 11: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
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 10.12.02 11:22
Sorry, macht für mich wenig bis gar keinen Sinn.
|
|
retnyg 
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Di 10.12.02 11: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
      
Beiträge: 189
|
Verfasst: Mi 11.12.02 01: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.
Ich selbst habe das bisher in Delphi noch nie realisiert, sondern nur Beispiele in C++ gesehen.
Gruß,
Markus
|
|
DeCodeGuru
      
Beiträge: 1333
Erhaltene Danke: 1
Arch Linux
Eclipse
|
Verfasst: Mi 11.12.02 13: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. 
_________________ Viele Grüße
Jakob
|
|
OregonGhost
      
Beiträge: 215
|
Verfasst: Mi 11.12.02 16: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.
_________________ Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
|
|
retnyg 
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Do 12.12.02 22:13
hört sich gut an, oregonghost, aber wie geht das ?
mfg
Retnyg
|
|
DaFox
      
Beiträge: 189
|
Verfasst: Fr 13.12.02 14:12
SetWindowLong()
Gruß,
Markus
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 13.12.02 14: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
      
Beiträge: 189
|
Verfasst: Fr 13.12.02 15:19
Hi Luckie!
Vollkommen richtig, ich habe das absichtlich verschwiegen...
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
Zuletzt bearbeitet von DaFox am Fr 13.12.02 15:20, insgesamt 1-mal bearbeitet
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Fr 13.12.02 15: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..
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
DaFox
      
Beiträge: 189
|
Verfasst: Fr 13.12.02 15:39
SetClassLong
Stimmt, das ist eine ernstzunehmende Alternative
Gruß,
Markus
|
|
|