myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: Windows-Forms » [Teilweise gelöst] WebBrowser-Element auf IE 9 oder höher nutzen?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

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

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Padman
myCSharp.de-Mitglied

Dabei seit: 02.07.2015
Beiträge: 52
Entwicklungsumgebung: VS 2015, C#
Herkunft: NRW


Padman ist offline

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

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 smile

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Padman am 06.09.2017 23:44.

05.09.2017 20:38 Beiträge des Benutzers | zu Buddylist hinzufügen
Papst Papst ist männlich
myCSharp.de-Mitglied

Dabei seit: 28.09.2014
Beiträge: 299
Entwicklungsumgebung: VS2017
Herkunft: Kassel


Papst ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
05.09.2017 20:44 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Padman
myCSharp.de-Mitglied

Dabei seit: 02.07.2015
Beiträge: 52
Entwicklungsumgebung: VS 2015, C#
Herkunft: NRW

Themenstarter Thema begonnen von Padman

Padman ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 großes Grinsen
Die IE-Variante würde definitiv ausreichen da die Dateien nicht unbedingt zu groß sein wären Augenzwinkern

Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Padman am 05.09.2017 21:09.

05.09.2017 21:07 Beiträge des Benutzers | zu Buddylist hinzufügen
trashkid2000 trashkid2000 ist männlich
myCSharp.de-Mitglied

Dabei seit: 27.12.2010
Beiträge: 156


trashkid2000 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
05.09.2017 23:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Padman
myCSharp.de-Mitglied

Dabei seit: 02.07.2015
Beiträge: 52
Entwicklungsumgebung: VS 2015, C#
Herkunft: NRW

Themenstarter Thema begonnen von Padman

Padman ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 06.09.2017 12:50.

06.09.2017 12:47 Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.734
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
06.09.2017 14:56 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Padman
myCSharp.de-Mitglied

Dabei seit: 02.07.2015
Beiträge: 52
Entwicklungsumgebung: VS 2015, C#
Herkunft: NRW

Themenstarter Thema begonnen von Padman

Padman ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
06.09.2017 16:01 Beiträge des Benutzers | zu Buddylist hinzufügen
dN!3L dN!3L ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2985.png


Dabei seit: 13.08.2004
Beiträge: 2.891


dN!3L ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

C#-Code:
/// <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:

C#-Code:
/// <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);
06.09.2017 18:31 Beiträge des Benutzers | zu Buddylist hinzufügen
Padman
myCSharp.de-Mitglied

Dabei seit: 02.07.2015
Beiträge: 52
Entwicklungsumgebung: VS 2015, C#
Herkunft: NRW

Themenstarter Thema begonnen von Padman

Padman ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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?
06.09.2017 19:15 Beiträge des Benutzers | zu Buddylist hinzufügen
dN!3L dN!3L ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2985.png


Dabei seit: 13.08.2004
Beiträge: 2.891


dN!3L ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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)

dN!3L hat dieses Bild (verkleinerte Version) angehängt:
Unbenannt.png
Volle Bildgröße

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von dN!3L am 06.09.2017 20:40.

06.09.2017 19:40 Beiträge des Benutzers | zu Buddylist hinzufügen
Padman
myCSharp.de-Mitglied

Dabei seit: 02.07.2015
Beiträge: 52
Entwicklungsumgebung: VS 2015, C#
Herkunft: NRW

Themenstarter Thema begonnen von Padman

Padman ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 unglücklich

Wo sollte webBrowserControl1.SetWebbrowserVersion()[tt]; stehen ohne das eine Fehlermeldung erscheint?

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Padman am 06.09.2017 20:08.

06.09.2017 19:59 Beiträge des Benutzers | zu Buddylist hinzufügen
dN!3L dN!3L ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2985.png


Dabei seit: 13.08.2004
Beiträge: 2.891


dN!3L ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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?
06.09.2017 20:42 Beiträge des Benutzers | zu Buddylist hinzufügen
Padman
myCSharp.de-Mitglied

Dabei seit: 02.07.2015
Beiträge: 52
Entwicklungsumgebung: VS 2015, C#
Herkunft: NRW

Themenstarter Thema begonnen von Padman

Padman ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich sage doch, ich stehe leider auf dem Schlauch unglücklich

Wo wäre dann dieses irgendwo? Augenzwinkern

Hier der komplette Code:

C#-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 Augenzwinkern

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Padman am 06.09.2017 21:47.

06.09.2017 21:41 Beiträge des Benutzers | zu Buddylist hinzufügen
dN!3L dN!3L ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2985.png


Dabei seit: 13.08.2004
Beiträge: 2.891


dN!3L ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Z.B. nach dem InitializeComponent();
Den Rest bekommst du sicherlich alleine hin...
06.09.2017 22:12 Beiträge des Benutzers | zu Buddylist hinzufügen
Padman
myCSharp.de-Mitglied

Dabei seit: 02.07.2015
Beiträge: 52
Entwicklungsumgebung: VS 2015, C#
Herkunft: NRW

Themenstarter Thema begonnen von Padman

Padman ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hat wohl doch nun geklappt großes Grinsen

Leider hatte ich den hier übersehen Daumen hoch
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 smile

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

Habe ein Beispiel gefunden welches den Reg-Eintrag wieder löscht großes Grinsen

C#-Code:
            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 Augenzwinkern aber das ist vermutlich wieder ein eigenes Thema, richtig? Augenzwinkern

Dieser Beitrag wurde 6 mal editiert, zum letzten Mal von Padman am 06.09.2017 23:49.

06.09.2017 22:27 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 3 Jahre.
Der letzte Beitrag ist älter als 3 Jahre.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 25.09.2020 02:27