Extended WebBrowser Klasse

Aus ITwiki
Version vom 11. Dezember 2013, 13:42 Uhr von Flo84 (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „In einem meiner C# Programme greife ich auf die WebBrowser-Klasse zu, um eine Webseite im Programm darstellen zu können. Problem ist hierbei aber, dass beim …“)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

In einem meiner C# Programme greife ich auf die WebBrowser-Klasse zu, um eine Webseite im Programm darstellen zu können. Problem ist hierbei aber, dass beim Öffnen eines Popup-Fensters eine neue Instanz des Internet Explorers aufgerufen wird, die aktuelle Browser-Sitzung / Anmeldung geht im sich öffnenden Popup-Fenster verloren.

Lösung

Geholfen hat mir hierbei dieser auf stackoverflow.com sowie auch Beitrag. Wichtig zu wissen: wird im Popup-Browserfenster, welches ja eine simple Windows Form darstellt, z. B. per Javascript ein "Close" ausgeführt, wird im WebBrowser zwar eine weiße, leere Seite dargestellt, das Windows selbst beendet sich aber nicht. Im zweiten Link von oben wird erklärt, wie man eine entsprechende Klasse "ExtendedWebBrowser" erstellt. Diese sieht z. B. so aus:

public delegate void ClosingEventHandler(object sender, EventArgs e);
class ExtendedWebBrowser:WebBrowser
{
    // Define constants from winuser.h
    private const int WM_PARENTNOTIFY = 0x210;
    private const int WM_DESTROY = 2;
    public event ClosingEventHandler Closing;
    protected override void WndProc(ref Message m)
    {
       switch (m.Msg)
       {
           case WM_PARENTNOTIFY:
               if (!DesignMode)
               {
                 if (m.WParam.ToInt32() == WM_DESTROY)
                 {
                    Closing(this, EventArgs.Empty);
                 }
               }
               DefWndProc(ref m);
               break;
           default:
               base.WndProc(ref m);
               break;
        }
    }
}

Ich erstellte dann eine neue Windows Form mit dem Namen "WebBrowserPopup", zog ein ExtendedWebBrowser-Controll mit folgendem Code auf:

public partial class webbrowserPopup : Form
{
    public WebBrowser Browser
    {
        get { return extendedwebbrowserPopup; }
    }
    public webbrowserPopup()
    {
        InitializeComponent();
    }
    private void extendedwebbrowserPopup_Closing(object sender, EventArgs e)
    {
        this.Close();
    }
}

Zurück zum Hauptformular mit meinem WebBrowser-Controll: füge dem Objekt das Ereignis "NewWindow" mit folgendem Inhalt hinzu:

nativeBrowser = (SHDocVw.WebBrowser)webbrowserOTRS.ActiveXInstance;
nativeBrowser.RegisterAsBrowser = true;
nativeBrowser.NewWindow2 +=new SHDocVw.DWebBrowserEvents2_NewWindow2EventHandler(nativeBrowser_NewWindow2);

Das Objekt "nativeBrowser" sowie "popup" wurde für die Klasse deklariert und im Ereignis "NewWindow" instanziert. Der Code von "NewWindow2" sieht so aus:

popup = new webbrowserPopup();
popup.Show(this);
ppDisp = popup.Browser.ActiveXInstance;

Für weitere Details einfach die beiden Beiträge durchlesen.