Laden...

[Teilweise gelöst] WebBrowser-Element auf IE 9 oder höher nutzen?

Erstellt von Padman vor 6 Jahren Letzter Beitrag vor 6 Jahren 5.180 Views
P
Padman Themenstarter:in
52 Beiträge seit 2015
vor 6 Jahren
[Teilweise gelöst] WebBrowser-Element auf IE 9 oder höher nutzen?

Hallo,

ich habe mich fast kaputt gesucht. Und zwar möchte ich wissen, ob und wie das Steuerelement WebBrowser die neuere Version des IE verwenden kann?

Ich möchte eine Seite in C# via dem Steuerelement aufrufen welche aber wohl erst ab Version 9 ohne Fehler wie JavaScript funktioniert. Wäre dies möglich?

Herzlichen Dank 🙂

Gruß Padman
P
441 Beiträge seit 2014
vor 6 Jahren

Ich würde vermuten (ohne in die Doku geschaut zu haben), dass die installierte IE Version genutzt wird.
Alternativ kannst du soetwas wie den Awesomium SDK nutzen

P
Padman Themenstarter:in
52 Beiträge seit 2015
vor 6 Jahren

Ich würde vermuten (ohne in die Doku geschaut zu haben), dass die installierte IE Version genutzt wird.

Das ist richtig.

Ich weiß nur, dass die Webseite ab IE 9 einwandfrei und ohne Fehlermeldungen im IE läuft, ich konnte auch ein komplettes Projekt finden, aber der Aufbau ist für mich doch etwas zu hoch, da ich sonst nur das Nötigste daraus verwendet hätte, es handelt sich um Configuring the emulation mode of an Internet Explorer WebBrowser control (cyotek.com/blog/configuring-the-emulation-mode-of-an-internet-explorer-webbrowser-control). Es kann sein dass ich momentan nur Begriffsstutzig bin da es mir nicht so gut geht...

Alternativ kannst du soetwas wie den Awesomium SDK nutzen Schaue ich mir bei Gelegenheit an, wobei die auch schon vom Alter her etwas betagt ist 😁
Die IE-Variante würde definitiv ausreichen da die Dateien nicht unbedingt zu groß sein wären 😉

Gruß Padman
T
156 Beiträge seit 2010
vor 6 Jahren

Hallo Padman,

Es kann sein dass ich momentan nur Begriffsstutzig bin da es mir nicht so gut geht...

Dann Dir gute Besserung erstmal!

Habe mir die SampleApp auch mal angeschaut. Also es scheint so, als ob das nur aus der Registry gelesen werden kann, also vor der ersten Instanziierung eines WebBrowserControls auch dort drin stehen muss 😕
Ätzend, von der Registry bin ich überhaupt kein Freund...
lG, Marko

P
Padman Themenstarter:in
52 Beiträge seit 2015
vor 6 Jahren

Anscheinend geht es wohl nicht anders als aus der Registry zu lesen, wenn es ohne gehen würde, wäre auch nicht verkehrt.

Könnte man daraus das Nötigste rausfischen damit im Prinzip nur noch der eingebettete Browser angezeigt wird und eventuell noch ein Reload-Button?

Ich verstehe nicht warum das normale WebBrowser-Steuerelement keine Version zur Auswahl anbietet und so wie es aussieht, nur die alte Version des IE verwendet. Microsoft hätte das Steuerelement etwas aktualisieren können wenn es schon dort vorhanden ist...

Gruß Padman
4.931 Beiträge seit 2008
vor 6 Jahren

Die aktuell installierte und verwendete Version kann man mittels WebBrowser.Version ermitteln.

Falls du selber die Möglichkeit hast, den HTML-Inhalt zu bestimmen, dann steht unter Web Browser Control & Specifying the IE Version noch eine Möglichkeit mittels des meta-Tags.

P
Padman Themenstarter:in
52 Beiträge seit 2015
vor 6 Jahren

Das Problem ist, das allgemein auch andere Seiten aufgerufen werden sollen, von daher besteht nicht die Möglichkeit den Inhalt selber zu bestimmen.

Den Code vom Beispiel hatte ich mir ja angeschaut, aber ich weiß leider nicht, was das Nötigste wäre, damit man halt nur noch das Element samt passender IE-Version hätte.

Gruß Padman
2.891 Beiträge seit 2004
vor 6 Jahren

Wenn ich dein Problem richtig verstehe, sollte folgender Code weiterhelfen (einfach einmal für ein WebBroserControl aufrufen, gilt dann für den ganzen Prozess):


/// <summary>
/// Aktiviert die aktuellen InternetExplorer-Features für das WebBrowser-Control
/// </summary>
public static void SetWebbrowserVersion(this WebBrowser webBrowser)
{ 
	int registryValue = (webBrowser.Version.Major>=11) ? 11001 : (webBrowser.Version.Major==10) ? 10001 : (webBrowser.Version.Major==9) ? 9999 : (webBrowser.Version.Major==8) ? 8888 : 7000;
	string registryKeyPath = @"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION";
	using (RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(registryKeyPath,true) ?? Registry.CurrentUser.CreateSubKey(registryKeyPath))
		registryKey.SetValue(Process.GetCurrentProcess().ProcessName + ".exe",registryValue,RegistryValueKind.DWord);
}

In diesem Zusammenhang vll. auch noch interessant:


/// <summary>
/// Beschränkt die Persistenz von Cookies im WebBrowser-Control auf den aktuellen Prozess
/// </summary>
public static unsafe void SuppressWininetBehavior(this WebBrowser webBrowser)
{
	int option = (int)3/* INTERNET_SUPPRESS_COOKIE_PERSIST*/;
	int* optionPtr = &option;

	if (!InternetSetOption(0,81/*INTERNET_OPTION_SUPPRESS_BEHAVIOR*/,new IntPtr(optionPtr),sizeof(int)))
		throw new Exception("Something went wrong !>?");
}
[DllImport("wininet.dll",CharSet = CharSet.Auto,SetLastError = true)]
private static extern bool InternetSetOption(int hInternet,int dwOption,IntPtr lpBuffer,int dwBufferLength);

P
Padman Themenstarter:in
52 Beiträge seit 2015
vor 6 Jahren

Ich habe mal beide Sachen eingebaut, wobei this entfernt werden musste da sonst Fehler auftauchten. Ich habe ja bereits das eine Element webBrowser im Designer eingefügt gehabt, aber Änderungen gab es jetzt keine, muss noch was bestimmtes gemacht werden?

Gruß Padman
2.891 Beiträge seit 2004
vor 6 Jahren

Das this ist drin, da das bei mir eine Erweiterungsmethode ist. Wenn du die Methode in eine statische Klasse packst, funktioniert es mit this und du kannst direkt webBrowserControl1.SetWebbrowserVersion() aufrufen.

Du musst irgendwann noch SetWebbrowserVersion aufrufen (und dein WebBrowserControl übergeben). Hast du das gemacht?

Das Ergebnis ist dann z.B. (übrigens: Nachdem du einmal SetWebbrowserVersion aufgerufen, kannst du den Effekt nur rückgängig machen, indem du den angelegten Registry-Wert wieder manuell löscht oder den Namen deiner EXE-Datei änderst)

P
Padman Themenstarter:in
52 Beiträge seit 2015
vor 6 Jahren

Ich hatte lange Zeit in C# nichts mehr gemacht gehabt und mir geht's momentan auch nicht so gut und in C# bleibe ich wohl weiterhin Daueranfänger, von daher stehe ich leider auf dem Schlauch 🙁

Wo sollte _webBrowserControl1.SetWebbrowserVersion()`;[/i] stehen ohne das eine Fehlermeldung erscheint?

Gruß Padman
2.891 Beiträge seit 2004
vor 6 Jahren

Das mit der Erweiterungsmethode kannst du erstmal vergessen, wenn dir das nichts sagt. Nicht schlimm.

Du rufst irgendwo in deinem Programm SetWebbrowserVersion(deineWebBrowserControlInstanz) auf, oder?

P
Padman Themenstarter:in
52 Beiträge seit 2015
vor 6 Jahren

Ich sage doch, ich stehe leider auf dem Schlauch 🙁

Wo wäre dann dieses irgendwo? 😉

Hier der komplette Code:

using System.Windows.Forms;
using System.Diagnostics;
using Microsoft.Win32;
using System;
using System.Runtime.InteropServices;

namespace SimpleBrowser
{
    public partial class Form1 : Form
    {
        /// <summary>
        /// Aktiviert die aktuellen InternetExplorer-Features für das WebBrowser-Control
        /// </summary>
        public void SetWebbrowserVersion(WebBrowser webBrowser)
        {
            int registryValue = (webBrowser.Version.Major >= 11) ? 11001 : (webBrowser.Version.Major == 10) ? 10001 : (webBrowser.Version.Major == 9) ? 9999 : (webBrowser.Version.Major == 8) ? 8888 : 7000;
            string registryKeyPath = @"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION";
            using (RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(registryKeyPath, true) ?? Registry.CurrentUser.CreateSubKey(registryKeyPath))
                registryKey.SetValue(Process.GetCurrentProcess().ProcessName + ".exe", registryValue, RegistryValueKind.DWord);
        }

        /// <summary>
        /// Beschränkt die Persistenz von Cookies im WebBrowser-Control auf den aktuellen Prozess
        /// </summary>
        public static unsafe void SuppressWininetBehavior(WebBrowser webBrowser)
        {
            int option = (int)3/* INTERNET_SUPPRESS_COOKIE_PERSIST*/;
            int* optionPtr = &option;

            if (!InternetSetOption(0, 81/*INTERNET_OPTION_SUPPRESS_BEHAVIOR*/, new IntPtr(optionPtr), sizeof(int)))
                throw new Exception("Something went wrong !>?");
        }
        [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool InternetSetOption(int hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength);

        public Form1()
        {
            InitializeComponent();
        }
    }
}

Der Designer enthält das Element WebBrowser...

Jetzt wäre die Frage wie es nun aktiviert werden könnte 😉

Gruß Padman
2.891 Beiträge seit 2004
vor 6 Jahren

Z.B. nach dem InitializeComponent();
Den Rest bekommst du sicherlich alleine hin...

P
Padman Themenstarter:in
52 Beiträge seit 2015
vor 6 Jahren

Hat wohl doch nun geklappt 😁

Leider hatte ich den hier übersehen 👍_SetWebbrowserVersion(deineWebBrowserControlInstanz)_

Anscheinend kommt die Umstellung der IE-Version etwas zu spät und das Programm muss nochmal neu gestartet werden damit der Web-Inhalt richtig geladen wird...

Ansonsten erstmal vielen Dank für die Lösung 🙂

Ach so, stellt unsafe ein Sicherheitsrisiko dar oder wie ist es dort gemeint?

Habe ein Beispiel gefunden welches den Reg-Eintrag wieder löscht 😁

            string keyName = @"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION";
            using (RegistryKey key = Registry.CurrentUser.OpenSubKey(keyName, true))
            {
                if (key == null)
                {
                    // Key doesn't exist. Do whatever you want to handle
                    // this case
                }
                else
                {
                    key.DeleteValue(Process.GetCurrentProcess().ProcessName + ".exe");
                }
            }

Quelle: stackoverflow.com/questions/531151/how-to-delete-a-registry-value-in-c-sharp

Hmm, mir fällt gerade auf, dass die bestimmte Seite erst beim 2. Anlauf erst richtig läd...

Gäbe es überhaupt eine Möglichkeit das Kontextmenü zu beschränken dass zumindest einige Einträge verschwinden? Es soll zumindest möglich sein, dass Texte kopiert werden können 😉 aber das ist vermutlich wieder ein eigenes Thema, richtig? 😉

Gruß Padman