.NET-WebBrowser-Steuerelement von IE7 auf IE11 umstellen (mit C#)

Mit verwundert es immer wieder, dass das WebBrowser-Steuerelement (Windows Forms) auch in der 2015 .NET/Visual-Studio-Version in der Grundeinstellung den Internet Explorer 7 simuliert.

Nach längere Recherche habe ich bei MSDN die Lösung gefunden: Eine Registry-Einstellung ist notwendig, um beispielsweise den IE11 (oder eine beliebig andere Version) als Standard einzustellen. Beim Start der Anwendung kann man mit folgendem Code den entsprechenden Registry-Eintrag generieren:

Registry.SetValue(@"HKEY_CURRENT_USER\SOFTWARE\Microsoft\
 Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION",
 AppDomain.CurrentDomain.FriendlyName,
 "11000",
 RegistryValueKind.DWord);

Die „11“ zu Beginn des vierten Parameters steht für die gewünschte Version. Ein kleines Problem gibt es, wenn man diese Anwendung als „Click Once“-Setup-Datei verteilt, denn dann hat die Anwendung nicht die Berechtigung, die Registry zu modifizieren (eine Änderung des App-Manifest hilft da übrigens nicht: „Click Once“ Anwendungen kann man keine Admin-Berechtigung zuteilen). Eine mögliche Lösung: man prüft bei Start, ob der Registry-Schlüssel richtig gesetzt ist. Falls nein startet man einen neuen Prozess, der regedit.exe startet und eine update.reg Datei ausführt, die man entsprechend vorbereitet hat und zusammen mit der Anwendung verteilt. Beispiel:

RegistryKey key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\
  Microsoft\Internet Explorer\Main\FeatureControl\
  FEATURE_BROWSER_EMULATION\");

try
{
  //gibt es den Key? Ansonsten wird ein Fehler geworfen
  string v = key.GetValue(AppDomain.CurrentDomain.FriendlyName)
                .ToString();
}
catch
{
  //Key gibt es nicht, deshalb
  //regedit mit update.reg starten
   string p = "/s " + System.IO
    .Path
    .GetDirectoryName(System
      .Reflection
      .Assembly
      .GetExecutingAssembly()
      .Location) + @"\update.reg";

   Process regeditProcess = Process.Start("regedit.exe", p);
   regeditProcess.WaitForExit();
}

Sicherlich keine perfekte Lösung, aber ein solider Workaround.

 

Dieser Beitrag wurde unter C#, Programmierung veröffentlicht. Setze ein Lesezeichen auf den Permalink.

Kommentar verfassen