Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
[Teilweise gelöst] WebBrowser-Element auf IE 9 oder höher nutzen?
Padman
myCSharp.de - Member



Dabei seit:
Beiträge: 52
Herkunft: NRW

Themenstarter:

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

beantworten | zitieren | melden

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
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Padman am .
Gruß Padman
private Nachricht | Beiträge des Benutzers
Papst
myCSharp.de - Experte



Dabei seit:
Beiträge: 421
Herkunft: Kassel

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Padman
myCSharp.de - Member



Dabei seit:
Beiträge: 52
Herkunft: NRW

Themenstarter:

beantworten | zitieren | melden

Zitat von Papst
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...
Zitat
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
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Padman am .
Gruß Padman
private Nachricht | Beiträge des Benutzers
trashkid2000
myCSharp.de - Member



Dabei seit:
Beiträge: 156

beantworten | zitieren | melden

Hallo Padman,
Zitat von 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
private Nachricht | Beiträge des Benutzers
Padman
myCSharp.de - Member



Dabei seit:
Beiträge: 52
Herkunft: NRW

Themenstarter:

beantworten | zitieren | melden

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...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Padman am .
Gruß Padman
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.359

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Padman
myCSharp.de - Member



Dabei seit:
Beiträge: 52
Herkunft: NRW

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 2.891

beantworten | zitieren | melden

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);
private Nachricht | Beiträge des Benutzers
Padman
myCSharp.de - Member



Dabei seit:
Beiträge: 52
Herkunft: NRW

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 2.891

beantworten | zitieren | melden

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)
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von dN!3L am .
Attachments
private Nachricht | Beiträge des Benutzers
Padman
myCSharp.de - Member



Dabei seit:
Beiträge: 52
Herkunft: NRW

Themenstarter:

beantworten | zitieren | melden

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?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Padman am .
Gruß Padman
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 2.891

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
Padman
myCSharp.de - Member



Dabei seit:
Beiträge: 52
Herkunft: NRW

Themenstarter:

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Padman am .
Gruß Padman
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 2.891

beantworten | zitieren | melden

Z.B. nach dem InitializeComponent();
Den Rest bekommst du sicherlich alleine hin...
private Nachricht | Beiträge des Benutzers
Padman
myCSharp.de - Member



Dabei seit:
Beiträge: 52
Herkunft: NRW

Themenstarter:

beantworten | zitieren | melden

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?
Dieser Beitrag wurde 6 mal editiert, zum letzten Mal von Padman am .
Gruß Padman
private Nachricht | Beiträge des Benutzers