Einzelnen Beitrag anzeigen

Benutzerbild von Ultimator
Ultimator

Registriert seit: 17. Feb 2004
Ort: Coburg
1.860 Beiträge
 
FreePascal / Lazarus
 
#6

Re: Adressleiste vom IE lesen & ändern

  Alt 26. Jul 2005, 20:51
Okay, dann schaun wir doch mal

Mit Hilfe von Assarbads EDA hab ich rausbekommen, dass der Klassenname des IE-Fensters IEFrame ist.
Also werfen wir doch mal die MSDN-Suche mit dem Stichwort Findwindow an.
Wir finden folgendes:
Zitat:
Syntax

HWND FindWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName
);
Die Funktion Findwindow gibt uns also das Handle des gefundenen Fensters wieder. Weiter unten in der Beschreibung dazu lesen wir, dass wir einen Parameter mit nil füllen können. Da wir den Klassennamen haben, lassen wir lpWindowName mit nil "unbeachtet". Wir rufen also auf:
Delphi-Quellcode:
var IEHandle: HWND;
begin
 IEHandle := FindWindow('IEFrame', nil);
end;
Wir haben nun also das Handle unseres IE-Fensters, sollte alles glatt gegangen sein

So, nu brachen wa ja noch das Handle unserer Adresszeile
Also füllen wir die MSDN-Suche diesmal mit FindWindowEx, und Microsoft präsentiert uns folgendes:
Zitat:
Syntax

HWND FindWindowEx(
HWND hwndParent,
HWND hwndChildAfter,
LPCTSTR lpszClass,
LPCTSTR lpszWindow
);
Gut, das Handle des Parents haben wir ja gerade ermittelt (erster Parameter).
Dann wollen wir ja vom ersten Kindfenster aus die Suche beginnen lassen, also setzen wir den zweiten Parameter auf 0.
Den Klassennamen des Adressfensters hab ich ja schon genannt: 'Edit'. Das kommt also als 3. Parameter rein.
Und mit dem 4. Parameter verfahren wir wieder wie schon bei FindWindow, den setzen wir auf nil.

Allerdings haben wir ein kleineres Problem, da das Edit-Fenster kein direktes Kindfenster des IE-Fensters ist.
Es liegen also noch ein paar Parents dazwischen. Allerdings müssen wir nicht bis ganz runter zum Edit suchen, denn schon die ComboBoxEx32 bietet uns den gesuchten Text (Herausgefunden hab ich das alles wieder mit Assarbads EDA ).
Wir müssen also FindWindowEx ein paar Mal anwenden, und zwar wie folgt:

Dann sind wir insgesamt soweit:
Delphi-Quellcode:
var IEHandle, AdressCB: HWND;
begin
 IEHandle := FindWindow('IEFrame', nil);
 AdressCB := FindWindowEx(IEHandle, 0, 'WorkerW', nil);
 AdressCB := FindWindowEx(AdressCB, 0, 'ReBarWindow32', nil);
 AdressCB := FindWindowEx(AdressCB, 0, 'ComboBoxEx32', nil);
end;
Nun haben wir das Handle unserer ComboBoxEx32, in der schon die Adresse drinsteht. Nun rufen wir nochmal SendMesssage mit WM_GETTEXT auf, um die Adresse auch zu bekommen, und dann passt der Laden

Wir brauchen also noch nen Buffer, wo der Text reinkommt, und dann rufen wir SendMessage auf:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var IEHandle, AdressCB: HWND;
    buffer: array[0..MAX_PATH] of char;
begin
 IEHandle := FindWindow('IEFrame', nil);
 AdressCB := FindWindowEx(IEHandle, 0, 'WorkerW', nil);
 AdressCB := FindWindowEx(AdressCB, 0, 'ReBarWindow32', nil);
 AdressCB := FindWindowEx(AdressCB, 0, 'ComboBoxEx32', nil);
 SendMessage(AdressCB, wm_gettext, sizeof(buffer), Integer(@buffer));
 ShowMessage(string(buffer));
end;
Wie uns das ShowMessage beweist, haben wir nun die Adresse in string(buffer) stehen.

Um die Adresse zu ändern, kannst du WM_SETTEXT verwenden.

So, ich glaub ich hab noch nie so eine lange Antwort geschrieben, deswegen fänd ichs nett, wenn du posten würdest, obs bei dir geht
Julian J. Pracht
  Mit Zitat antworten Zitat