La version par défaut du contrôle navigateur Web dans une application C # Windows Forms Est 7. J'ai changé à 9 avec l'article Navigateur Emulation, mais comment utiliser dernière version d'Internet Explorer installée dans un contrôle Webbrowser?
J'ai vu la réponse de Veer. Je pense que c'est juste, mais ça ne m'a pas fonctionné. J'utilise peut-être .NET 4 et j'utilise un système d'exploitation 64x, merci de vérifier cela.
Vous pouvez mettre en place ou vérifier au démarrage de votre application:
private void Form1_Load(object sender, EventArgs e)
{
var appName = Process.GetCurrentProcess().ProcessName + ".exe";
SetIE8KeyforWebBrowserControl(appName);
}
private void SetIE8KeyforWebBrowserControl(string appName)
{
RegistryKey Regkey = null;
try
{
// For 64 bit machine
if (Environment.Is64BitOperatingSystem)
Regkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\\Wow6432Node\\Microsoft\\Internet Explorer\\MAIN\\FeatureControl\\FEATURE_BROWSER_EMULATION", true);
else //For 32 bit machine
Regkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_BROWSER_EMULATION", true);
// If the path is not correct or
// if the user haven't priviledges to access the registry
if (Regkey == null)
{
MessageBox.Show("Application Settings Failed - Address Not found");
return;
}
string FindAppkey = Convert.ToString(Regkey.GetValue(appName));
// Check if key is already present
if (FindAppkey == "8000")
{
MessageBox.Show("Required Application Settings Present");
Regkey.Close();
return;
}
// If a key is not present add the key, Key value 8000 (decimal)
if (string.IsNullOrEmpty(FindAppkey))
Regkey.SetValue(appName, unchecked((int)0x1F40), RegistryValueKind.DWord);
// Check for the key after adding
FindAppkey = Convert.ToString(Regkey.GetValue(appName));
if (FindAppkey == "8000")
MessageBox.Show("Application Settings Applied Successfully");
else
MessageBox.Show("Application Settings Failed, Ref: " + FindAppkey);
}
catch (Exception ex)
{
MessageBox.Show("Application Settings Failed");
MessageBox.Show(ex.Message);
}
finally
{
// Close the Registry
if (Regkey != null)
Regkey.Close();
}
}
Vous pouvez trouver messagebox.show, juste pour les tests.
Les clés sont les suivantes:
11001 (0x2AF9) - Internet Explorer 11. Les pages Web sont affichées dans IE11 Mode Edge, quelle que soit la directive
!DOCTYPE
.11000 (0x2AF8) - Internet Explorer 11. Pages Web contenant Les directives
!DOCTYPE
basées sur des normes sont affichées en mode IE11 Edge . Valeur par défaut pour IE11.10001 (0x2711) - Internet Explorer 10. Les pages Web sont affichées dans les normes IE10 mode, quelle que soit la directive
!DOCTYPE
.10000 (0x2710) - Internet Explorer 10. Pages Web contenant des fichiers .__ normalisés. Les directives
!DOCTYPE
sont affichées en mode IE10 Standards. Défaut valeur pour Internet Explorer 10.9999 (0x270F) - Internet Explorer 9. Les pages Web sont affichées dans IE9 Mode standard, quelle que soit la directive
!DOCTYPE
.9000 (0x2328) - Internet Explorer 9. Pages Web contenant Les directives
!DOCTYPE
basées sur des normes sont affichées en mode IE9.8888 (0x22B8) - Les pages Web sont affichées en mode Normes IE8, indépendamment de la directive
!DOCTYPE
.8000 (0x1F40) - Pages Web contenant le
!DOCTYPE
.__ basé sur des normes. les directives sont affichées en mode IE8.7000 (0x1B58) - Pages Web contenant le
!DOCTYPE
.__ basé sur des normes. les directives sont affichées en mode IE7 Standards.
Référence: MSDN: Contrôles des fonctionnalités Internet
J'ai vu des applications comme Skype utiliser 10001. Je ne sais pas.
REMARQUE
L'application d'installation va changer le registre. Vous devrez peut-être ajouter une ligne dans le fichier manifeste pour éviter les erreurs dues aux autorisations de modification du registre:
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
UPDATE 1
Ceci est une classe qui obtiendra la dernière version de IE sous Windows et y apportera les modifications qui s’imposent;
public class WebBrowserHelper
{
public static int GetEmbVersion()
{
int ieVer = GetBrowserVersion();
if (ieVer > 9)
return ieVer * 1000 + 1;
if (ieVer > 7)
return ieVer * 1111;
return 7000;
} // End Function GetEmbVersion
public static void FixBrowserVersion()
{
string appName = System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetExecutingAssembly().Location);
FixBrowserVersion(appName);
}
public static void FixBrowserVersion(string appName)
{
FixBrowserVersion(appName, GetEmbVersion());
} // End Sub FixBrowserVersion
// FixBrowserVersion("<YourAppName>", 9000);
public static void FixBrowserVersion(string appName, int ieVer)
{
FixBrowserVersion_Internal("HKEY_LOCAL_MACHINE", appName + ".exe", ieVer);
FixBrowserVersion_Internal("HKEY_CURRENT_USER", appName + ".exe", ieVer);
FixBrowserVersion_Internal("HKEY_LOCAL_MACHINE", appName + ".vshost.exe", ieVer);
FixBrowserVersion_Internal("HKEY_CURRENT_USER", appName + ".vshost.exe", ieVer);
} // End Sub FixBrowserVersion
private static void FixBrowserVersion_Internal(string root, string appName, int ieVer)
{
try
{
//For 64 bit Machine
if (Environment.Is64BitOperatingSystem)
Microsoft.Win32.Registry.SetValue(root + @"\Software\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", appName, ieVer);
else //For 32 bit Machine
Microsoft.Win32.Registry.SetValue(root + @"\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", appName, ieVer);
}
catch (Exception)
{
// some config will hit access rights exceptions
// this is why we try with both LOCAL_MACHINE and CURRENT_USER
}
} // End Sub FixBrowserVersion_Internal
public static int GetBrowserVersion()
{
// string strKeyPath = @"HKLM\SOFTWARE\Microsoft\Internet Explorer";
string strKeyPath = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer";
string[] ls = new string[] { "svcVersion", "svcUpdateVersion", "Version", "W2kVersion" };
int maxVer = 0;
for (int i = 0; i < ls.Length; ++i)
{
object objVal = Microsoft.Win32.Registry.GetValue(strKeyPath, ls[i], "0");
string strVal = System.Convert.ToString(objVal);
if (strVal != null)
{
int iPos = strVal.IndexOf('.');
if (iPos > 0)
strVal = strVal.Substring(0, iPos);
int res = 0;
if (int.TryParse(strVal, out res))
maxVer = Math.Max(maxVer, res);
} // End if (strVal != null)
} // Next i
return maxVer;
} // End Function GetBrowserVersion
}
utilisation de classe comme suit
WebBrowserHelper.FixBrowserVersion();
WebBrowserHelper.FixBrowserVersion("SomeAppName");
WebBrowserHelper.FixBrowserVersion("SomeAppName",intIeVer);
vous pouvez être confronté à un problème de comparabilité de Windows 10, en raison de votre site Web même.
<meta http-equiv="X-UA-Compatible" content="IE=11" >
Prendre plaisir :)
Utilisation des valeurs de MSDN :
int BrowserVer, RegVal;
// get the installed IE version
using (WebBrowser Wb = new WebBrowser())
BrowserVer = Wb.Version.Major;
// set the appropriate IE version
if (BrowserVer >= 11)
RegVal = 11001;
else if (BrowserVer == 10)
RegVal = 10001;
else if (BrowserVer == 9)
RegVal = 9999;
else if (BrowserVer == 8)
RegVal = 8888;
else
RegVal = 7000;
// set the actual key
using (RegistryKey Key = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", RegistryKeyPermissionCheck.ReadWriteSubTree))
if (Key.GetValue(System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe") == null)
Key.SetValue(System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe", RegVal, RegistryValueKind.DWord);
var appName = System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe";
using (var Key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", true))
Key.SetValue(appName, 99999, RegistryValueKind.DWord);
D'après ce que j'ai lu ici ( Contrôle de la compatibilité des contrôles WebBrowser :
Que se passe-t-il si je définis une valeur de mode document FEATURE_BROWSER_EMULATION supérieure à la version IE sur le client?} _
Bien entendu, le contrôle du navigateur ne peut prendre en charge qu'un mode de document inférieur ou égal à la version IE installée sur le client. L'utilisation de la clé FEATURE_BROWSER_EMULATION fonctionne mieux pour les applications métier d'entreprise dans lesquelles une version prise en charge et déployée du navigateur. Si vous définissez la valeur sur un mode de navigateur d'une version supérieure à la version de navigateur installée sur le client, le contrôle du navigateur choisira le mode de document le plus élevé disponible.
Le plus simple est de mettre un nombre décimal très élevé ...
Vous pouvez essayer ceci link
try
{
var IEVAlue = 9000; // can be: 9999 , 9000, 8888, 8000, 7000
var targetApplication = Processes.getCurrentProcessName() + ".exe";
var localMachine = Registry.LocalMachine;
var parentKeyLocation = @"SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl";
var keyName = "FEATURE_BROWSER_EMULATION";
"opening up Key: {0} at {1}".info(keyName, parentKeyLocation);
var subKey = localMachine.getOrCreateSubKey(parentKeyLocation,keyName,true);
subKey.SetValue(targetApplication, IEVAlue,RegistryValueKind.DWord);
return "all done, now try it on a new process".info();
}
catch(Exception ex)
{
ex.log();
"NOTE: you need to run this under no UAC".info();
}
Plutôt que de changer la RegKey, j'ai pu mettre une ligne dans l'en-tête de mon code HTML:
<html>
<head>
<!-- Use lastest version of Internet Explorer -->
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<!-- Insert other header tags here -->
</head>
...
</html>
Voir Contrôle du navigateur Web et Spécification de la version IE.
J'ai pu implémenter la solution de Luca, mais j'ai dû faire quelques changements pour que cela fonctionne. Mon objectif était d'utiliser D3.js avec un contrôle de navigateur Web pour une application Windows Forms (ciblant .NET 2.0). Cela fonctionne pour moi maintenant. J'espère que cela peut aider quelqu'un d'autre.
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Threading;
using Microsoft.Win32;
using System.Diagnostics;
namespace ClientUI
{
static class Program
{
static Mutex mutex = new System.Threading.Mutex(false, "jMutex");
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
if (!mutex.WaitOne(TimeSpan.FromSeconds(2), false))
{
// Another application instance is running
return;
}
try
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var targetApplication = Process.GetCurrentProcess().ProcessName + ".exe";
int ie_emulation = 11999;
try
{
string tmp = Properties.Settings.Default.ie_emulation;
ie_emulation = int.Parse(tmp);
}
catch { }
SetIEVersioneKeyforWebBrowserControl(targetApplication, ie_emulation);
Application.Run(new MainForm());
}
finally
{
mutex.ReleaseMutex();
}
}
private static void SetIEVersioneKeyforWebBrowserControl(string appName, int ieval)
{
RegistryKey Regkey = null;
try
{
Regkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", true);
// If the path is not correct or
// if user doesn't have privileges to access the registry
if (Regkey == null)
{
MessageBox.Show("Application FEATURE_BROWSER_EMULATION Failed - Registry key Not found");
return;
}
string FindAppkey = Convert.ToString(Regkey.GetValue(appName));
// Check if key is already present
if (FindAppkey == ieval.ToString())
{
MessageBox.Show("Application FEATURE_BROWSER_EMULATION already set to " + ieval);
Regkey.Close();
return;
}
// If key is not present or different from desired, add/modify the key , key value
Regkey.SetValue(appName, unchecked((int)ieval), RegistryValueKind.DWord);
// Check for the key after adding
FindAppkey = Convert.ToString(Regkey.GetValue(appName));
if (FindAppkey == ieval.ToString())
{
MessageBox.Show("Application FEATURE_BROWSER_EMULATION changed to " + ieval + "; changes will be visible at application restart");
}
else
{
MessageBox.Show("Application FEATURE_BROWSER_EMULATION setting failed; current value is " + ieval);
}
}
catch (Exception ex)
{
MessageBox.Show("Application FEATURE_BROWSER_EMULATION setting failed; " + ex.Message);
}
finally
{
//Close the Registry
if (Regkey != null) Regkey.Close();
}
}
}
}
De plus, j'ai ajouté une chaîne (ie_emulation) aux paramètres du projet avec la valeur 11999. Cette valeur semble fonctionner pour IE11 (11.0.15).
Ensuite, j'ai dû modifier l'autorisation de mon application pour autoriser l'accès au registre. Cela peut être fait en ajoutant un nouvel élément à votre projet (en utilisant VS2012). Sous Eléments généraux, sélectionnez Fichier du manifeste d'application. Changez le niveau de asInvoker à requireAdministrator (comme indiqué ci-dessous).
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Si quelqu'un qui lit ceci essaie d'utiliser D3.js avec un contrôle WebBrowser, vous devrez peut-être modifier les données JSON afin de les stocker dans une variable de votre page HTML, car D3.json utilise XmlHttpRequest (plus facile à utiliser avec un serveur Web). Après ces modifications et ce qui précède, mes formulaires Windows peuvent charger des fichiers HTML locaux qui appellent D3.
Voici la méthode que j’utilise habituellement et qui fonctionne pour moi (pour les applications 32 bits et 64 bits; ie_emulation peut être documenté ici: Internet Feature Controls (B..C), Emulation de navigateur):
[STAThread]
static void Main()
{
if (!mutex.WaitOne(TimeSpan.FromSeconds(2), false))
{
// Another application instance is running
return;
}
try
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var targetApplication = Process.GetCurrentProcess().ProcessName + ".exe";
int ie_emulation = 10000;
try
{
string tmp = Properties.Settings.Default.ie_emulation;
ie_emulation = int.Parse(tmp);
}
catch { }
SetIEVersioneKeyforWebBrowserControl(targetApplication, ie_emulation);
m_webLoader = new FormMain();
Application.Run(m_webLoader);
}
finally
{
mutex.ReleaseMutex();
}
}
private static void SetIEVersioneKeyforWebBrowserControl(string appName, int ieval)
{
RegistryKey Regkey = null;
try
{
Regkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", true);
// If the path is not correct or
// if user haven't privileges to access the registry
if (Regkey == null)
{
YukLoggerObj.logWarnMsg("Application FEATURE_BROWSER_EMULATION Failed - Registry key Not found");
return;
}
string FindAppkey = Convert.ToString(Regkey.GetValue(appName));
// Check if key is already present
if (FindAppkey == "" + ieval)
{
YukLoggerObj.logInfoMsg("Application FEATURE_BROWSER_EMULATION already set to " + ieval);
Regkey.Close();
return;
}
// If a key is not present or different from desired, add/modify the key, key value
Regkey.SetValue(appName, unchecked((int)ieval), RegistryValueKind.DWord);
// Check for the key after adding
FindAppkey = Convert.ToString(Regkey.GetValue(appName));
if (FindAppkey == "" + ieval)
YukLoggerObj.logInfoMsg("Application FEATURE_BROWSER_EMULATION changed to " + ieval + "; changes will be visible at application restart");
else
YukLoggerObj.logWarnMsg("Application FEATURE_BROWSER_EMULATION setting failed; current value is " + ieval);
}
catch (Exception ex)
{
YukLoggerObj.logWarnMsg("Application FEATURE_BROWSER_EMULATION setting failed; " + ex.Message);
}
finally
{
// Close the Registry
if (Regkey != null)
Regkey.Close();
}
}
Utilisation:
// Get the installed Internet Explorer version
using (WebBrowser Wb = new WebBrowser())
BrowserVer = Wb.Version.Major;
// Set the appropriate Internet Explorer version
if (BrowserVer >= 11)
RegVal = 11001;
else if (BrowserVer == 10)
RegVal = 10001;
else if (BrowserVer == 9)
RegVal = 9999;
else if (BrowserVer == 8)
RegVal = 8888;
else
RegVal = 7000;
// Set the actual key
RegistryKey Key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", true);
Key.SetValue(System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe", RegVal, RegistryValueKind.DWord);
Key.Close();
Combinez les réponses de RooiWillie et MohD
et n'oubliez pas de lancer votre application avec des droits administratifs.
var appName = System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe";
RegistryKey Regkey = null;
try
{
int BrowserVer, RegVal;
// get the installed IE version
using (WebBrowser Wb = new WebBrowser())
BrowserVer = Wb.Version.Major;
// set the appropriate IE version
if (BrowserVer >= 11)
RegVal = 11001;
else if (BrowserVer == 10)
RegVal = 10001;
else if (BrowserVer == 9)
RegVal = 9999;
else if (BrowserVer == 8)
RegVal = 8888;
else
RegVal = 7000;
//For 64 bit Machine
if (Environment.Is64BitOperatingSystem)
Regkey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"SOFTWARE\\Wow6432Node\\Microsoft\\Internet Explorer\\MAIN\\FeatureControl\\FEATURE_BROWSER_EMULATION", true);
else //For 32 bit Machine
Regkey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"SOFTWARE\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_BROWSER_EMULATION", true);
//If the path is not correct or
//If user't have priviledges to access registry
if (Regkey == null)
{
MessageBox.Show("Registry Key for setting IE WebBrowser Rendering Address Not found. Try run the program with administrator's right.");
return;
}
string FindAppkey = Convert.ToString(Regkey.GetValue(appName));
//Check if key is already present
if (FindAppkey == RegVal.ToString())
{
Regkey.Close();
return;
}
Regkey.SetValue(appName, RegVal, RegistryValueKind.DWord);
}
catch (Exception ex)
{
MessageBox.Show("Registry Key for setting IE WebBrowser Rendering failed to setup");
MessageBox.Show(ex.Message);
}
finally
{
//Close the Registry
if (Regkey != null)
Regkey.Close();
}
il suffit d'ajouter les éléments suivants à votre code HTML sans avoir à définir de paramètres
<meta http-equiv="X-UA-Compatible" content="IE=11" >
Une solution de contournement facile et peu coûteuse consiste à indiquer une valeur supérieure à 11001 dans la clé FEATURE_BROWSER_EMULATION. Ensuite, il faut le dernier IE disponible dans le système.
Version Visual Basic:
Private Sub setRegisterForWebBrowser()
Dim appName = Process.GetCurrentProcess().ProcessName + ".exe"
SetIE8KeyforWebBrowserControl(appName)
End Sub
Private Sub SetIE8KeyforWebBrowserControl(appName As String)
'ref: http://stackoverflow.com/questions/17922308/use-latest-version-of-ie-in-webbrowser-control
Dim Regkey As RegistryKey = Nothing
Dim lgValue As Long = 8000
Dim strValue As Long = lgValue.ToString()
Try
'For 64 bit Machine
If (Environment.Is64BitOperatingSystem) Then
Regkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\\Wow6432Node\\Microsoft\\Internet Explorer\\MAIN\\FeatureControl\\FEATURE_BROWSER_EMULATION", True)
Else 'For 32 bit Machine
Regkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_BROWSER_EMULATION", True)
End If
'If the path Is Not correct Or
'If user't have priviledges to access registry
If (Regkey Is Nothing) Then
MessageBox.Show("Application Settings Failed - Address Not found")
Return
End If
Dim FindAppkey As String = Convert.ToString(Regkey.GetValue(appName))
'Check if key Is already present
If (FindAppkey = strValue) Then
MessageBox.Show("Required Application Settings Present")
Regkey.Close()
Return
End If
'If key Is Not present add the key , Kev value 8000-Decimal
If (String.IsNullOrEmpty(FindAppkey)) Then
' Regkey.SetValue(appName, BitConverter.GetBytes(&H1F40), RegistryValueKind.DWord)
Regkey.SetValue(appName, lgValue, RegistryValueKind.DWord)
'check for the key after adding
FindAppkey = Convert.ToString(Regkey.GetValue(appName))
End If
If (FindAppkey = strValue) Then
MessageBox.Show("Registre de l'application appliquée avec succès")
Else
MessageBox.Show("Échec du paramètrage du registre, Ref: " + FindAppkey)
End If
Catch ex As Exception
MessageBox.Show("Application Settings Failed")
MessageBox.Show(ex.Message)
Finally
'Close the Registry
If (Not Regkey Is Nothing) Then
Regkey.Close()
End If
End Try
End Sub
Je sais que cela a été posté, mais voici une version actuelle pour dotnet 4.5 ci-dessus que j'utilise. Je recommande d'utiliser l'émulation de navigateur par défaut en respectant doctype
InternetExplorerFeatureControl.Instance.BrowserEmulation = DocumentMode.DefaultRespectDocType;
internal class InternetExplorerFeatureControl
{
private static readonly Lazy<InternetExplorerFeatureControl> LazyInstance = new Lazy<InternetExplorerFeatureControl>(() => new InternetExplorerFeatureControl());
private const string RegistryLocation = @"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl";
private readonly RegistryView _registryView = Environment.Is64BitOperatingSystem && Environment.Is64BitProcess ? RegistryView.Registry64 : RegistryView.Registry32;
private readonly string _processName;
private readonly Version _version;
#region Feature Control Strings (A)
private const string FeatureRestrictAboutProtocolIe7 = @"FEATURE_RESTRICT_ABOUT_PROTOCOL_IE7";
private const string FeatureRestrictAboutProtocol = @"FEATURE_RESTRICT_ABOUT_PROTOCOL";
#endregion
#region Feature Control Strings (B)
private const string FeatureBrowserEmulation = @"FEATURE_BROWSER_EMULATION";
#endregion
#region Feature Control Strings (G)
private const string FeatureGpuRendering = @"FEATURE_GPU_RENDERING";
#endregion
#region Feature Control Strings (L)
private const string FeatureBlockLmzScript = @"FEATURE_BLOCK_LMZ_SCRIPT";
#endregion
internal InternetExplorerFeatureControl()
{
_processName = $"{Process.GetCurrentProcess().ProcessName}.exe";
using (var webBrowser = new WebBrowser())
_version = webBrowser.Version;
}
internal static InternetExplorerFeatureControl Instance => LazyInstance.Value;
internal RegistryHive RegistryHive { get; set; } = RegistryHive.CurrentUser;
private int GetFeatureControl(string featureControl)
{
using (var currentUser = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, _registryView))
{
using (var key = currentUser.CreateSubKey($"{RegistryLocation}\\{featureControl}", false))
{
if (key.GetValue(_processName) is int value)
{
return value;
}
return -1;
}
}
}
private void SetFeatureControl(string featureControl, int value)
{
using (var currentUser = RegistryKey.OpenBaseKey(RegistryHive, _registryView))
{
using (var key = currentUser.CreateSubKey($"{RegistryLocation}\\{featureControl}", true))
{
key.SetValue(_processName, value, RegistryValueKind.DWord);
}
}
}
#region Internet Feature Controls (A)
/// <summary>
/// Windows Internet Explorer 8 and later. When enabled, feature disables the "about:" protocol. For security reasons, applications that Host the WebBrowser Control are strongly encouraged to enable this feature.
/// By default, this feature is enabled for Windows Internet Explorer and disabled for applications hosting the WebBrowser Control.To enable this feature using the registry, add the name of your executable file to the following setting.
/// </summary>
internal bool AboutProtocolRestriction
{
get
{
if (_version.Major < 8)
throw new NotSupportedException($"{AboutProtocolRestriction} requires Internet Explorer 8 and Later.");
var releaseVersion = new Version(8, 0, 6001, 18702);
return Convert.ToBoolean(GetFeatureControl(_version >= releaseVersion ? FeatureRestrictAboutProtocolIe7 : FeatureRestrictAboutProtocol));
}
set
{
if (_version.Major < 8)
throw new NotSupportedException($"{AboutProtocolRestriction} requires Internet Explorer 8 and Later.");
var releaseVersion = new Version(8, 0, 6001, 18702);
SetFeatureControl(_version >= releaseVersion ? FeatureRestrictAboutProtocolIe7 : FeatureRestrictAboutProtocol, Convert.ToInt16(value));
}
}
#endregion
#region Internet Feature Controls (B)
/// <summary>
/// Windows Internet Explorer 8 and later. Defines the default emulation mode for Internet Explorer and supports the following values.
/// </summary>
internal DocumentMode BrowserEmulation
{
get
{
if (_version.Major < 8)
throw new NotSupportedException($"{nameof(BrowserEmulation)} requires Internet Explorer 8 and Later.");
var value = GetFeatureControl(FeatureBrowserEmulation);
if (Enum.IsDefined(typeof(DocumentMode), value))
{
return (DocumentMode)value;
}
return DocumentMode.NotSet;
}
set
{
if (_version.Major < 8)
throw new NotSupportedException($"{nameof(BrowserEmulation)} requires Internet Explorer 8 and Later.");
var tmp = value;
if (value == DocumentMode.DefaultRespectDocType)
tmp = DefaultRespectDocType;
else if (value == DocumentMode.DefaultOverrideDocType)
tmp = DefaultOverrideDocType;
SetFeatureControl(FeatureBrowserEmulation, (int)tmp);
}
}
#endregion
#region Internet Feature Controls (G)
/// <summary>
/// Internet Explorer 9. Enables Internet Explorer to use a graphics processing unit (GPU) to render content. This dramatically improves performance for webpages that are rich in graphics.
/// By default, this feature is enabled for Internet Explorer and disabled for applications hosting the WebBrowser Control.To enable this feature by using the registry, add the name of your executable file to the following setting.
/// Note: GPU rendering relies heavily on the quality of your video drivers. If you encounter problems running Internet Explorer with GPU rendering enabled, you should verify that your video drivers are up to date and that they support hardware accelerated graphics.
/// </summary>
internal bool GpuRendering
{
get
{
if (_version.Major < 9)
throw new NotSupportedException($"{nameof(GpuRendering)} requires Internet Explorer 9 and Later.");
return Convert.ToBoolean(GetFeatureControl(FeatureGpuRendering));
}
set
{
if (_version.Major < 9)
throw new NotSupportedException($"{nameof(GpuRendering)} requires Internet Explorer 9 and Later.");
SetFeatureControl(FeatureGpuRendering, Convert.ToInt16(value));
}
}
#endregion
#region Internet Feature Controls (L)
/// <summary>
/// Internet Explorer 7 and later. When enabled, feature allows scripts stored in the Local Machine zone to be run only in webpages loaded from the Local Machine zone or by webpages hosted by sites in the Trusted Sites list. For more information, see Security and Compatibility in Internet Explorer 7.
/// By default, this feature is enabled for Internet Explorer and disabled for applications hosting the WebBrowser Control.To enable this feature by using the registry, add the name of your executable file to the following setting.
/// </summary>
internal bool LocalScriptBlocking
{
get
{
if (_version.Major < 7)
throw new NotSupportedException($"{nameof(LocalScriptBlocking)} requires Internet Explorer 7 and Later.");
return Convert.ToBoolean(GetFeatureControl(FeatureBlockLmzScript));
}
set
{
if (_version.Major < 7)
throw new NotSupportedException($"{nameof(LocalScriptBlocking)} requires Internet Explorer 7 and Later.");
SetFeatureControl(FeatureBlockLmzScript, Convert.ToInt16(value));
}
}
#endregion
private DocumentMode DefaultRespectDocType
{
get
{
if (_version.Major >= 11)
return DocumentMode.InternetExplorer11RespectDocType;
switch (_version.Major)
{
case 10:
return DocumentMode.InternetExplorer10RespectDocType;
case 9:
return DocumentMode.InternetExplorer9RespectDocType;
case 8:
return DocumentMode.InternetExplorer8RespectDocType;
default:
throw new ArgumentOutOfRangeException();
}
}
}
private DocumentMode DefaultOverrideDocType
{
get
{
if (_version.Major >= 11)
return DocumentMode.InternetExplorer11OverrideDocType;
switch (_version.Major)
{
case 10:
return DocumentMode.InternetExplorer10OverrideDocType;
case 9:
return DocumentMode.InternetExplorer9OverrideDocType;
case 8:
return DocumentMode.InternetExplorer8OverrideDocType;
default:
throw new ArgumentOutOfRangeException();
}
}
}
}
internal enum DocumentMode
{
NotSet = -1,
[Description("Webpages containing standards-based !DOCTYPE directives are displayed in IE latest installed version mode.")]
DefaultRespectDocType,
[Description("Webpages are displayed in IE latest installed version mode, regardless of the declared !DOCTYPE directive. Failing to declare a !DOCTYPE directive could causes the page to load in Quirks.")]
DefaultOverrideDocType,
[Description(
"Internet Explorer 11. Webpages are displayed in IE11 Edge mode, regardless of the declared !DOCTYPE directive. Failing to declare a !DOCTYPE directive causes the page to load in Quirks."
)] InternetExplorer11OverrideDocType = 11001,
[Description(
"IE11. Webpages containing standards-based !DOCTYPE directives are displayed in IE11 Edge mode. Default value for IE11."
)] InternetExplorer11RespectDocType = 11000,
[Description(
"Internet Explorer 10. Webpages are displayed in IE10 Standards mode, regardless of the !DOCTYPE directive."
)] InternetExplorer10OverrideDocType = 10001,
[Description(
"Internet Explorer 10. Webpages containing standards-based !DOCTYPE directives are displayed in IE10 Standards mode. Default value for Internet Explorer 10."
)] InternetExplorer10RespectDocType = 10000,
[Description(
"Windows Internet Explorer 9. Webpages are displayed in IE9 Standards mode, regardless of the declared !DOCTYPE directive. Failing to declare a !DOCTYPE directive causes the page to load in Quirks."
)] InternetExplorer9OverrideDocType = 9999,
[Description(
"Internet Explorer 9. Webpages containing standards-based !DOCTYPE directives are displayed in IE9 mode. Default value for Internet Explorer 9.\r\n" +
"Important In Internet Explorer 10, Webpages containing standards - based !DOCTYPE directives are displayed in IE10 Standards mode."
)] InternetExplorer9RespectDocType = 9000,
[Description(
"Webpages are displayed in IE8 Standards mode, regardless of the declared !DOCTYPE directive. Failing to declare a !DOCTYPE directive causes the page to load in Quirks."
)] InternetExplorer8OverrideDocType = 8888,
[Description(
"Webpages containing standards-based !DOCTYPE directives are displayed in IE8 mode. Default value for Internet Explorer 8\r\n" +
"Important In Internet Explorer 10, Webpages containing standards - based !DOCTYPE directives are displayed in IE10 Standards mode."
)] InternetExplorer8RespectDocType = 8000,
[Description(
"Webpages containing standards-based !DOCTYPE directives are displayed in IE7 Standards mode. Default value for applications hosting the WebBrowser Control."
)] InternetExplorer7RespectDocType = 7000
}