Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Internetexplorer Seite ändern und absenden (https://www.delphipraxis.net/65037-internetexplorer-seite-aendern-und-absenden.html)

Eichhoernchen 11. Mär 2006 12:41


Internetexplorer Seite ändern und absenden
 
Ja ich weiß, da steht scho nwas im Forum dazu drinn, aber nicht auf die Art und Weise wie ich es gern hätte, beziehungsweise so wie es da steht geht es bei mir nicht.


Also ich hab nen window handle das die class: 'Internet Explorer_Server' hat, nun möchte ich in diesem IE Fenster den Inhalt von einer <input type='text' id='n2'> Feld setzten und anschließend einen Knopf am ende des Formulars drücken.

Dazu habe ich mir bis jetzt diese beiden units angeschaut: MSHTML_TLB, SHDocVw_TLB



Nun habe ich folgendes versucht:
Delphi-Quellcode:
var hIE: HWND;
    ShellWindow: IShellWindows;
    i : integer;
Begin
  hIE := //Das Handle von meinem IE fenster das hab ich schon
  ShellWindow := CoShellWindows.Create;
  for i := 0 to ShellWindow.Count - 1 do
  begin
    if (shellwindow.Item(i) as iWebBrowser2).HWND = hIE
      then Begin
            showmessage('GEFUNDEN');
            ...
           end;
  end;
end;

Naja nur mein Problem ist das der der Fall in der If Abfrage niemals eintritt, woran liegt das?? Eigentlich müsste das doch klappen und das hIE handle stimmt zu 100%. Was mach ich falsch, bitte helfen!!!

marabu 11. Mär 2006 17:09

Re: Internetexplorer Seite ändern und absenden
 
Hallo Jan,

Zitat:

Zitat von Eichhoernchen
das hIE handle stimmt zu 100%

wie hast du es denn ermittelt? Warum brauchst du dieses Handle überhaupt?

Grüße vom marabu

Eichhoernchen 11. Mär 2006 23:47

Re: Internetexplorer Seite ändern und absenden
 
Naja ich hab da so ein Programm das listet mir alle Handles auf hab mir das Fenster rausgesucht und dann mein Programm mit Findwindow laufen lassen und es kommt zu dem selben Handle.


Wieso ich das brauche? Wie soll ich denn sonst auf das spezifische IE Fenster zugreifen?

Ich muss sagen ich kenne mich hier nicht besonders gut aus, wenn es um Kommunikation zwischen Prozessen geht, wenn es noch ne andere Möglichkeit gibt, nehm ich die natürlich auch gern. Hab mir nur gedacht, da ich das Handle kenne kann es nur einfacher werden und ich würde mir damit irgendwie Arbeit erleichtern.

Luckie 12. Mär 2006 00:53

Re: Internetexplorer Seite ändern und absenden
 
Zitat:

Zitat von Eichhoernchen
Ja ich weiß, da steht scho nwas im Forum dazu drinn, aber nicht auf die Art und Weise wie ich es gern hätte, beziehungsweise so wie es da steht geht es bei mir nicht.


Also ich hab nen window handle das die class: 'Internet Explorer_Server' hat, nun möchte ich in diesem IE Fenster den Inhalt von einer <input type='text' id='n2'> Feld setzten und anschließend einen Knopf am ende des Formulars drücken.

Und was ist daran so groß anders, wie bei den anderen hundert Beiträgen zum Thema "Eingabefeld ausfüllen und Button drücken in einem HTML Formular"?

Dass der Code bei dir nicht geht wird daran liegen, dass du irgendwo einen Fehler im Code haben wirst bzw. mit falschen Werten arbeitest.

marabu 12. Mär 2006 06:53

Re: Internetexplorer Seite ändern und absenden
 
Hallo Jan,

lass dir in der Schleife die Fenstergriffe ausgeben und vergleiche mit den Werten aus deinem Tool - vielleicht kannst du dann sehen, was schief läuft:

Delphi-Quellcode:
procedure TDemoForm.UrlButtonClick(Sender: TObject);
var
  sw: IShellWindows;
  i: Integer;
begin
  sw := CoShellWindows.Create;
  for i := 0 to Pred(sw.Count) do
    with sw.Item(i) as IWebBrowser2 do
      ShowMessage(Format('%d %s', [HWND, LocationURL]));
end;
Grüße vom marabu

Eichhoernchen 12. Mär 2006 15:52

Re: Internetexplorer Seite ändern und absenden
 
Habe die Schleife durchlaufen lassen, das Problem ist: sie generiert einen Fehler wenn ich sie bei 0 starten lasse, bei 1 Funktioniert es, nur bekomme ich nicht das Handle geliefert was ich möchte, ich hab mit den Werten des Programms verglichen, das Handle was ich suche wird nicht zurückgegeben.

Dann hab ich überprüft zu welchen Fenstern die zurückgegebenen Handle gehören und es ist einmal das Programm womit ich die Handle überprüft habe, das Fenster hatte die Klasse: cabinetWClass und das andere Fenster was er gefunden hat was eins vom Explorer mit der Klasse: ExploreWClass


Aber eben nicht das Fenster von dem IE. Vielleicht muss ich dazu sagen, dass das es nicht direkt der InternetExplorer ist sondern eben sowas wie der TWebbrowser bei Delphi, also ein InternetExplorer in einem anderem Programm eingebettet. Und ich denke eben das es der InternetExplorer ist da das Fenster die Klasse: 'Internet Explorer_Server'
hat!

marabu 12. Mär 2006 16:21

Re: Internetexplorer Seite ändern und absenden
 
Den Fehler kannst du leicht beseitigen, wenn du den Code etwas änderst:

Delphi-Quellcode:
procedure TDemoForm.UrlButtonClick(Sender: TObject);
var
  sw: IShellWindows;
  i: Integer;
begin
  sw := CoShellWindows.Create;
  for i := 0 to Pred(sw.Count) do
    if sw.Item(i) is IWebBrowser2 then
      with sw.Item(i) as IWebBrowser2 do
        ShowMessage(Format('%d %s', [HWND, LocationURL]));
end;
Die Schleife liefert dir IMO das Handle für das jeweilige top level window. Nimm doch mal das Handle, welches dir dein Tool liefert und hangele dich in einer Schleife über dessen parent windows - dabei sollte dir irgendwann ein Handle bekannt vorkommen.

marabu

Eichhoernchen 12. Mär 2006 17:59

Re: Internetexplorer Seite ändern und absenden
 
Nein leider nicht, dass hab ich auch schon versucht, da komm ich auch nicht weiter....

Ahh ja die if Anweisung macht Sinn... bringt michaber leider auch nicht weiter....


Villeicht kann man auf solche IE Fenster typen ja auch nicht zugreifen, aber warum nicht kann ich net sagen..

marabu 12. Mär 2006 18:01

Re: Internetexplorer Seite ändern und absenden
 
Ist dein ominöses Tool frei im Netz erhältlich? Ich würde es mir herunter laden und das Problem untersuchen, wenn du mir einen URL gibst.

marabu

Eichhoernchen 12. Mär 2006 18:49

Re: Internetexplorer Seite ändern und absenden
 
Das Programm schimpft sich WinVisibility(Website ist offline), aber was viel besser ist: Ich habe was im Netz gefunden mit dem ich es schaffe darauf zugriff zu bekommen:

Delphi-Quellcode:
uses ActiveX;

type
  TObjectFromLResult = function(LRESULT: lResult; const IID: TIID; WPARAM: wParam; out pObject): HRESULT; stdcall;


function GetIEFromHWND(WHandle: HWND; var IE: IWebbrowser2): HRESULT;
var
  hInst: HWND;
  lRes: Cardinal;
  MSG: Integer;
  pDoc: IHTMLDocument2;
  ObjectFromLresult: TObjectFromLresult;
begin
  hInst := LoadLibrary('Oleacc.dll');
  @ObjectFromLresult := GetProcAddress(hInst, 'ObjectFromLresult');
  if @ObjectFromLresult <> nil then begin
    try
      MSG := RegisterWindowMessage('WM_HTML_GETOBJECT');
      SendMessageTimeOut(WHandle, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
      Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc);
      if Result = S_OK then
        (pDoc.parentWindow as IServiceprovider).QueryService(IWebbrowserApp, IWebbrowser2, IE);
    finally
      FreeLibrary(hInst);
    end;
  end;
end;

Das funktioniert nur warum das andere nicht ist mir immernoch ein Rätsel.

Eichhoernchen 13. Mär 2006 21:58

Re: Internetexplorer Seite ändern und absenden
 
ähhhm... ich hätte da gern mal ein Problem:


Hmm wenn ich den Code in eine Delphi Anwendung stecke funktioniert er, soblad ich ihn in ein DLL schreibe funktioniert es nicht mehr, woran kann das liegen? Kann ich aus DLLs keine funktionen aus anderen DLLs aufrufen??

Wie könnte ich das Problem lösen?

Eichhoernchen 14. Mär 2006 15:20

Re: Internetexplorer Seite ändern und absenden
 
So, ich konnte den Fehler auf folgende Codezeile eingrenzen:

Delphi-Quellcode:
function GetIEFromHWND(WHandle: HWND; var IE: IWebbrowser2): HRESULT;
var
  hInst: HWND;
  lRes: Cardinal;
  MSG: Integer;
  pDoc: IHTMLDocument2;
  ObjectFromLresult: TObjectFromLresult;
begin
  hInst := LoadLibrary('Oleacc.dll');
  @ObjectFromLresult := GetProcAddress(hInst, 'ObjectFromLresult');
  if @ObjectFromLresult <> nil then begin
    try
      MSG := RegisterWindowMessage('WM_HTML_GETOBJECT');
      SendMessageTimeOut(WHandle, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
      Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc);
      if Result = S_OK then
        (pDoc.parentWindow as IServiceprovider).QueryService(IWebbrowserApp, IWebbrowser2, IE); //[b]HIER IST DER FEHLER[/b]
    finally
      FreeLibrary(hInst);
    end;
  end;
end;

Der Fehler tritt aber immer nur auf wenn ich den Code in eine DLL packe und dann ausführe,
der Fehler tritt nicht auf wenn ich den Code direkt aus dem Programm aus ausführe.

Valle 14. Mär 2006 16:17

Re: Internetexplorer Seite ändern und absenden
 
Ohne das eigentliche Geschehen stören zu wollen, aber das Handle mit dem Namen "Internet Explorer_Server" ist mei bir der Desktop.
Das verstehe ich nicht!? :gruebel: :wiejetzt:

Eichhoernchen 14. Mär 2006 16:52

Re: Internetexplorer Seite ändern und absenden
 
Hmm, war das nicht bei Windows 98 so das der Desktophintergrund irgendwie was mit dem IE zu tun hatte? Das sah doch immer so aus wenn der PC abesoffen war und man den Bildschirmhintergrund wiederherstellen wollte.


Hmm naja ich hab jetzt mal drübernach gedacht ich geh über die Methode einen riesen Umweg.

Ich will ja nur die Seite verändern, dazu brauch ich gar keinen IWebbrowser2. Ich bekomme ja schon ein IHTMLDocument2 zurückgeliefert mit dem ich den Inhalt ändern kann.


Mein jetzt funzender Code:

Delphi-Quellcode:
uses MSHTML_TLB, SHDocVw_TLB, ActiveX;

type
  TObjectFromLResult = function(LRESULT: lResult; const IID: TIID; WPARAM: wParam; out pObject): HRESULT; stdcall;

function GetHTMLFromHWND(WHandle: HWND; var html: IHTMLDocument3): HRESULT;
var
  hInst: HWND;
  lRes: Cardinal;
  MSG: Integer;
  ObjectFromLresult: TObjectFromLresult;
begin
  hInst := LoadLibrary('Oleacc.dll');
  @ObjectFromLresult := GetProcAddress(hInst, 'ObjectFromLresult');
  if @ObjectFromLresult <> nil then begin
    try
      MSG := RegisterWindowMessage('WM_HTML_GETOBJECT');
      SendMessageTimeOut(WHandle, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
      Result := ObjectFromLresult(lRes, IHTMLDocument3, 0, html);
    finally
      FreeLibrary(hInst);
    end;
  end;
end;

Hab jetzt IHTMLDocument3 genommen weil es dort mehr Editiermöglichekeiten gibt als bei IHTMLDocument2

Valle 14. Mär 2006 17:05

Re: Internetexplorer Seite ändern und absenden
 
Genau, so ist das. Kannst dir merken: Ist bei ME auch noch so.


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