Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi HTML aus InternetExplorer auslesen (https://www.delphipraxis.net/150214-html-aus-internetexplorer-auslesen.html)

Siegl 10. Apr 2010 10:12


HTML aus InternetExplorer auslesen
 
Hallo,

damit ich kontrollieren kann, welcher Inhalt gerade in den IE geladen ist, bräuchte ich den Zugriff auf den angezeigten HTML-Text des IE.
Dazu habe ich mir über Spywin die Handles ermittelt und es mit folgendem Code versucht:

Delphi-Quellcode:
procedure TAppForm.Button1Click(Sender: TObject);
var
  wndMain, wndChild: HWND; Size: Integer; PText: PChar;
begin
  wndMain := FindWindow('IEFrame','Google - Microsoft Internet Explorer');
  if wndMain <> 0 then
  begin
    wndChild := FindWindowEx(wndMain, 0, 'Shell DocObject View', nil);
    wndChild := FindWindowEx(wndChild, 0, 'Internet Explorer_Server', nil);
    if wndChild <> 0 then
    begin
      Size := SendMessage(wndChild,WM_GETTEXTLENGTH,0,0)+1;
      PText := AllocMem(Size);
      try
        if SendMessage(wndChild,WM_GETTEXT,wParam(Size),lParam(PText)) > 0 then
        begin
          ShowMessage(PText);
        end;
      finally
        FreeMem(PText,Size);
      end;
    end;
  end;
end;
Leider bringt mit schon die SendMessage(wndChild,WM_GETTEXTLENGTH,0,0)-Funktion den Wert "0" (Size also "1") zurück. Ich denke, dass es mit "WM_GETTEXTLENGTH" und "WM_GETTEXT" nicht geht, habe aber keine Ahnung wie sonst. Ich bin leider in der Programmierung mit direkten Windowsfunktionen unerfahren.

himitsu 10. Apr 2010 10:17

Re: HTML aus InternetExplorer auslesen
 
Hier mal 2 Seiten, um dich etwas einzulesen, und zu erfahren welche Schnittstelle du wohl benutzen mußt:
http://www.swissdelphicenter.com/de/showcode.php?id=373
http://www.swissdelphicenter.ch/de/showcode.php?id=1607

RWarnecke 10. Apr 2010 10:18

Re: HTML aus InternetExplorer auslesen
 
Diese Links sollten Dir weiterhelfen :

Link 1
Link 2
Link 3

TurboMartin 10. Apr 2010 11:31

Re: HTML aus InternetExplorer auslesen
 
Klick mich!

Siegl 10. Apr 2010 20:08

Re: HTML aus InternetExplorer auslesen
 
Vielen Dank für Euere Hilfe.

Ich kann den vorgeschlagenen Code erst kommende Woche wirklich testen.

Gruss Siegl

Siegl 11. Apr 2010 10:04

Re: HTML aus InternetExplorer auslesen
 
Hallo,

ich habe die vorgeschlagenen Codes angetestet. Dabei ist mir das Problem aufgetreten, dass "ovElements.item(i).Value" (s.u.) einfach nicht funktionieren will.
Der Code ist von swissdelphicenter.ch. Ich benutze XP und Delphi7.

Delphi-Quellcode:
uses
  MSHTML_TLB;

// first navigate to tipspage

procedure TForm1.Button1Click(Sender: TObject);
begin
  Webbrowser1.Navigate('http://www.swissdelphicenter.ch/en/tipsuchen.php');
end;

// Try to access IE instance and fill out the search field with
// a text and click the search button

procedure TForm1.Button3Click(Sender: TObject);
var
  hIE: HWND;
  ShellWindow: IShellWindows;
  WB: IWebbrowser2;
  spDisp: IDispatch;
  IDoc1: IHTMLDocument2;
  Document: Variant;
  k, m: Integer;
  ovElements: OleVariant;
  i: Integer;
begin
  ShellWindow := CoShellWindows.Create;
  // get the running instance of Internet Explorer
  for k := 0 to ShellWindow.Count do
  begin
    spDisp := ShellWindow.Item(k);
    if spDisp = nil then Continue;
    // QueryInterface determines if an interface can be used with an object
    spDisp.QueryInterface(iWebBrowser2, WB);

    if WB <> nil then
    begin
      WB.Document.QueryInterface(IHTMLDocument2, iDoc1);
      if iDoc1 <> nil then
      begin
        WB := ShellWindow.Item(k) as IWebbrowser2;
        begin
          Document := WB.Document;

          // count forms on document and iterate through its forms
          for m := 0 to Document.forms.Length - 1 do
          begin
            ovElements := Document.forms.Item(m).elements;
            // iterate through elements
            for i := 0 to ovElements.Length - 1 do
            begin
              // when input fieldname is found, try to fill out
              try
                if (CompareText(ovElements.item(i).tagName, 'INPUT') = 0) and
                  (CompareText(ovElements.item(i).type, 'text') = 0) then
                begin
                  ovElements.item(i).Value := 'FindWindow';                        // .Value funktioniert nicht !!!!
                end;
              except
              end;
              // when Submit button is found, try to click
              try
                if (CompareText(ovElements.item(i).tagName, 'INPUT') = 0) and
                  (CompareText(ovElements.item(i).type, 'SUBMIT') = 0) and
                  (ovElements.item(i).Value = 'Search') then // Suchen für German // .Value funktioniert nicht !!!!
                begin
                  ovElements.item(i).Click;
                end;
              except
              end;
            end;
          end;
        end;
      end;
    end;
  end;
end;
Eine Zusatzfrage hätte ich noch: Z.Z. erzeuge ich eine Timer-Instanz und prüfe jede Sekunde mit "FindWindow", ob das Programmfenster des IE gestartet wurde. Gibt es eine Windowsbotschaft, die das Erzeugen/Wechseln eines Fensters mitteilt? Das wäre dann eine sauberere Lösung.

Vielen Dank im voraus,

Gruß Siegl

Siegl 14. Apr 2010 15:14

Re: HTML aus InternetExplorer auslesen
 
Hallo,

kann mir da wirklich keiner weiterhelfen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:48 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