TCppwebbrowser - OnNewWindow



  • Hallo Leute!

    Es gibt in der TCppwebbrowser-Komponente das Ereignis "OnNewWindow". Es wird ausgelöst, wenn der Anwender z.B. die rechte Maustaste über einen Link klickt und "In neuem Fenster öffnen" anwählt. Wie man dann diese url in einem neuen eigenen Browser-Fenster (Child window) öffnet, wurde hier schon früher erwähnt.

    Ich möchte nun diese url in einer getrennten Browser-Anwendung (eigene exe-Datei) laden, wenn dieses Ereignis ausgelöst wird; so wie es der Internet Explorer macht.

    Danke für Eure Hilfe



  • Mit "hier schon früher erwähnt" beziehst du dich auf den entsprechenden FAQ-Beitrag?

    Der IE startet keine neue Programminstanz, da wird lediglich ein neues Fenster erzeugt. Und genauso kannst du auch vorgehen, wo ist das Problem?



  • Ich habe es mit diesem Konstrukt versucht:

    void __fastcall TFormMain::BrowserNewWindow2(TObject *Sender,
          LPDISPATCH *ppDisp, TOLEBOOL *Cancel)
    {
        TFormMain* NewForm = new TFormMain(Application);
        *ppDisp = NewForm->Browser->Application;
    
        NewForm->Show();
    }
    //---------------------------------------------------------------------------
    

    Funktioniert einwandfrei! Es wird ein neues Fenster geöffnet, in dem die Ziel-Url geladen wird. Es wird jedoch kein neues Feld in der Taskleiste angezeigt. Das bedeutet, das neue Fenster unterliegt der ersten Anwendung. Wenn dieses Fenster geschlossen wird, werden alle Fenster, die auf diese Art geöffnet wurden, auch geschlossen. Das macht der Internet Explorer nicht. Dieser erzeugt eine neue Anwendung, die unabhängig von der ersten läuft. Und die Frage ist, wie kann man so etwas erzeugen?
    Ich habe mir überlegt, mit CreateProcess meinen Browser starten. Nur wie übermittle ich der neuen Anwendung die neue URL?



  • Das Übermitteln und Auswerten (ParamStr()) dürfte wohl nicht das Problem sein, und zum Ermitteln der Link-URL gibt's jetzt einen neuen FAQ-Beitrag.



  • Das mit der Methode "OnStatusTextChange" könnte funktionieren, denn diese zeigt wirklich bei jedem Link die URL an. Doch was ist mit Fenstern, die automatisch z.B. von Javascript mit window.open geöffnet werden (Werbeanzeigen u.ä.). Dieser Link wird nicht vorher im Statusfeld angezeigt.

    Ich dachte da an das Argument "LPDISPATCH *ppDisp", in dem vielleicht die neue URL versteckt ist. Hast du (Jansen) vielleicht noch eine Idee, da du ja schon was mit HTML-Programmierung (QueryInterface usw.) getan hast? Oder gibt es eine Methode, wie ich an ppDisp eine neue Browseranwendung zuweisen kann?



  • Wie kommst du darauf, dass ich damit schon gearbeitet oder Ahnung hätte? 😉 Die Informationen habe ich auch alle nur im Web zusammengesucht.

    Ich habe keine Ahnung, ob/wie man an der "Inhalt" von ppDisp herankommt, ohne es zuvor einer anderen CppWebBrowser-Instanz zuzuweisen. Momentan würde ich wahrscheinlich gleich mit einer versteckten Browserinstanz arbeiten und dort im OnBeforeNavigate die URL auslesen und das Laden abbrechen.



  • Das "OnBeforeNavigate"-Ereignis wird in dem Fall, wenn ein neues Fenster geöffnet werden soll, nicht ausgelöst. Auf diese Idee bin ich auch schon gekommen. Es funktioniert nicht!
    Nach der Suche bei Google groups habe ich einen Link auf die Microsoft-Homepage gefunden:
    http://support.microsoft.com/default.aspx?scid=kb;EN-US;184876 HOWTO: Use the WebBrowser Control NewWindow2 Event

    Doch aus dem Code-Beispiel werde ich nicht schlau. Laut der Beschreibung sieht das neue Fenster aus wie eine neue Instanz der Applikation (bei SDI-Applikationen). Nur wie setzt man diesen Code um in VCL-Sprache?



  • Original erstellt von Nick:
    Das "OnBeforeNavigate"-Ereignis wird in dem Fall, wenn ein neues Fenster geöffnet werden soll, nicht ausgelöst.

    Mit *ppDisp = VersteckterBrowser->Application; wird beim versteckten Browser nach meinen Tests sehr wohl OnBeforeNavigate ausgelöst.



  • Das habe ich auch festgestellt. Du meinst also, im "OnBeforeNavigate"-Ereignis der versteckten Browserinstanz die Url zu ermitteln, diese per Parameter der neuen eigenen Anwendung in der Parameterliste übergeben (CreateProcess o.ä.). Ich werde es mal ausprobieren.

    Die Informationen habe ich auch alle nur im Web zusammengesucht.

    Kannst du angeben, woher? Vielleicht bekommt man dort weitere Informationen über den Einsatz von "ppDisp", z.B. über weitere Parameter wie Höhe und Breite der neuen Instanz.



  • Original erstellt von Nick:
    im "OnBeforeNavigate"-Ereignis der versteckten Browserinstanz die Url zu ermitteln ...

    Genau.

    Was die Suche im Web betrifft, meine Haupt-Informationsquelle sind die Borland-Newsgroups, die man zB. per Google Groups vergleichsweise bequem durchsuchen kann.


Anmelden zum Antworten