using System;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Runtime.InteropServices;
using Microsoft.Win32;
using Newtonsoft.Json;
namespace DataUtils
{
public static class BrowserEmulation
{
// The emulation value used in original C++ (11001).
// 11001 typically corresponds to IE11 in edge mode for most hosts.
private const int EmulationValue = 11001;
///
/// Set the browser emulation value for the current user and current executable.
/// Writes to HKCU\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION.
/// Creates the key if it does not exist.
///
public static void SetWebBrowserEmulation ()
{
try
{
string exeName = GetCurrentProcessFileName ();
if (string.IsNullOrEmpty (exeName)) return;
// Registry path under HKCU (per-user setting)
const string subKey = @"Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION";
using (RegistryKey key = Registry.CurrentUser.CreateSubKey (subKey, RegistryKeyPermissionCheck.ReadWriteSubTree))
{
if (key == null) return;
// set DWORD value
key.SetValue (exeName, EmulationValue, RegistryValueKind.DWord);
}
}
catch
{
// ignore exceptions to match original "best-effort" behavior
}
}
///
/// 获取系统安装的 Internet Explorer 主版本号(如 8、9、10、11)。
/// 会尝试从 64-bit registry view 和 32-bit registry view 读取(HKLM\SOFTWARE\Microsoft\Internet Explorer)。
/// 返回 0 表示未能读取到版本信息。
///
public static int GetInternetExplorerVersionMajor ()
{
const string ieKey = @"SOFTWARE\Microsoft\Internet Explorer";
string versionStr = null;
// Try RegistryView.Registry64 then Registry32 for robustness on WOW64 systems
foreach (RegistryView view in new [] { RegistryView.Registry64, RegistryView.Registry32 })
{
try
{
using (RegistryKey baseKey = RegistryKey.OpenBaseKey (RegistryHive.LocalMachine, view))
using (RegistryKey key = baseKey.OpenSubKey (ieKey))
{
if (key == null) continue;
object svcVersion = key.GetValue ("svcVersion");
if (svcVersion is string)
{
versionStr = (string)svcVersion;
}
else
{
object ver = key.GetValue ("Version");
if (ver is string) versionStr = (string)ver;
}
}
}
catch
{
// ignore and continue to next view
}
if (!string.IsNullOrEmpty (versionStr)) break;
}
if (string.IsNullOrEmpty (versionStr)) return 0;
// parse major number before first non-digit/dot
int major = 0;
try
{
// common version formats: "11.0.9600.16428" etc.
string [] parts = versionStr.Split (new char [] { '.' }, StringSplitOptions.RemoveEmptyEntries);
if (parts.Length > 0 && int.TryParse (parts [0], out major))
{
return major;
}
// fallback: try to read first integer found
string num = "";
foreach (char c in versionStr)
{
if (char.IsDigit (c)) num += c;
else break;
}
if (!string.IsNullOrEmpty (num) && int.TryParse (num, out major)) return major;
}
catch
{
// ignore parsing errors
}
return 0;
}
public static int IEVersionMajor => GetInternetExplorerVersionMajor ();
public static bool IsInternetExplorer10 ()
{
return GetInternetExplorerVersionMajor () == 10;
}
public static bool IE10 => IsInternetExplorer10 ();
public static bool IsInternetExplorer11AndLater ()
{
return GetInternetExplorerVersionMajor () >= 11;
}
public static bool IE11 => IsInternetExplorer11AndLater ();
// Helper: get file name of current process executable, e.g. "myapp.exe"
private static string GetCurrentProcessFileName ()
{
try
{
string path = null;
try
{
// prefer process main module (may throw in some restricted environments)
path = Process.GetCurrentProcess ().MainModule.FileName;
}
catch
{
try
{
var asm = System.Reflection.Assembly.GetEntryAssembly ();
if (asm != null) path = asm.Location;
}
catch { }
}
if (string.IsNullOrEmpty (path))
{
path = AppDomain.CurrentDomain.FriendlyName;
}
if (string.IsNullOrEmpty (path)) return string.Empty;
return Path.GetFileName (path);
}
catch
{
return string.Empty;
}
}
}
[ComVisible (true)]
public interface IScriptBridge
{
///
/// 调用程序窗口实例中的事件
///
/// 函数名
/// 事件参数
/// 调用结果
object CallEvent (string funcName, object e);
}
[ComVisible (true)]
[ClassInterface (ClassInterfaceType.AutoDual)]
public class _I_IEFrame
{
public int Version => BrowserEmulation.IEVersionMajor;
public string ParseHtmlColor (string color)
{
try
{
Color dcolor = ColorTranslator.FromHtml (color);
var obj = new
{
r = (ushort)dcolor.R,
g = (ushort)dcolor.G,
b = (ushort)dcolor.B,
a = (ushort)dcolor.A
};
return JsonConvert.SerializeObject (obj);
}
catch
{
return "{}";
}
}
private IWebBrowserPageScale iwbps;
public _I_IEFrame (IWebBrowserPageScale _iwbps)
{
iwbps = _iwbps;
}
public int Scale
{
get { return iwbps.PageScale; }
set { iwbps.PageScale = value; }
}
}
}