using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Drawing; using System.IO; using System.Reflection; using System.Runtime.InteropServices; using System.Security; using System.Windows.Forms; using CefSharp; using CefSharp.WinForms; using KGdev.BI3D.Revit.Addin.MainWindow.External.Browser.Properties; namespace KGdev.BI3D.Revit.Addin.MainWindow.External.Browser { internal partial class BrowserForm : Form { public BrowserForm( BrowserConfiguration configuration, BrowserFunctions functions, Queue browserToRevitActions, Queue revitToBrowserActions ) { this.configuration = configuration; this.functions = functions; this.browserToRevitActions = browserToRevitActions; this.revitToBrowserActions = revitToBrowserActions; //AssemblyLoaderUtil loaderUtil = new AssemblyLoaderUtil( // Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) // ); //loaderUtil.HookAssemblyResolve(); //try //{ //} //catch (Exception ex) //{ // MessageBox.Show(ex.Message); //} //finally //{ // loaderUtil.UnhookAssemblyResolve(); //} var dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); //Assembly.LoadFrom(dir + "//CefSharp.Core.dll"); //Assembly.LoadFile( // @"D:\Users\Zhanggg\Desktop\KGdev.BI3D.Revit\KGdev.BI3D.Revit.Addin.MainWindow.External.Browser\bin\Debug\net472\CefSharp.dll" //); //Assembly.LoadFile( // @"D:\Users\Zhanggg\Desktop\KGdev.BI3D.Revit\KGdev.BI3D.Revit.Addin.MainWindow.External.Browser\bin\Debug\net472\CefSharp.Core.dll" //); //Assembly.LoadFile( // @"D:\Users\Zhanggg\Desktop\KGdev.BI3D.Revit\KGdev.BI3D.Revit.Addin.MainWindow.External.Browser\bin\Debug\net472\CefSharp.WinForms.dll" //); base.Load += (object sender, EventArgs args) => { this.CreateBrowser(); Size windowSize = Settings.Default.WindowSize; bool flag2 = true; if (flag2) { base.Size = Settings.Default.WindowSize; } base.FormClosing += this.Form_Browser_FormClosing; base.FormClosed += this.Form_Browser_FormClosed; }; this.InitializeComponent(); this.Text = configuration.Title; bool flag = configuration.ParentProcessId > 0; if (flag) { try { Process processById = Process.GetProcessById(configuration.ParentProcessId); IntPtr mainWindowHandle = processById.MainWindowHandle; BrowserForm.NativeMethod.SetWindowLongPtr64(base.Handle, -8, mainWindowHandle); } catch { } } this.SendMessage("handle:" + base.Handle.ToString()); this.actionTimer.Tick += this.Action_timer_Tick; this.actionTimer.Start(); } private void Action_timer_Tick(object sender, EventArgs e) { bool flag = this.browserToRevitActions.Count > 0; if (flag) { string text = this.browserToRevitActions.Dequeue(); this.SendMessage(text); } bool flag2 = this.revitToBrowserActions.Count > 0; if (flag2) { string text2 = this.revitToBrowserActions.Dequeue(); this.browser.ExecuteScriptAsync( string.Concat( new string[] { this.configuration.Net2JsObjectName, ".", this.configuration.Net2JsUpdateStatePartialFunctionName, "(", text2, ")" } ) ); } bool flag3 = this.configuration.ParentProcessId > 0; if (flag3) { try { Process processById = Process.GetProcessById( this.configuration.ParentProcessId ); } catch { base.Close(); } } } private void SendMessage(string message) { BrowserForm.MyStruct myStruct; myStruct.Message = message; int num = Marshal.SizeOf(myStruct); IntPtr intPtr = Marshal.AllocHGlobal(num); try { Marshal.StructureToPtr(myStruct, intPtr, true); BrowserForm.COPYDATASTRUCT copydatastruct = new BrowserForm.COPYDATASTRUCT { cbData = num, lpData = intPtr }; BrowserForm .NativeMethod .SendMessage( this.configuration.MessageHandle, 74, base.Handle, ref copydatastruct ); } finally { Marshal.FreeHGlobal(intPtr); } } protected override void WndProc(ref Message m) { bool flag = m.Msg == 74; if (flag) { BrowserForm.COPYDATASTRUCT copydatastruct = (BrowserForm.COPYDATASTRUCT) m.GetLParam(typeof(BrowserForm.COPYDATASTRUCT)); bool flag2 = copydatastruct.cbData == Marshal.SizeOf(typeof(BrowserForm.MyStruct)); if (flag2) { BrowserForm.MyStruct myStruct = (BrowserForm.MyStruct) Marshal.PtrToStructure(copydatastruct.lpData, typeof(BrowserForm.MyStruct)); this.revitToBrowserActions.Enqueue(myStruct.Message); base.Visible = true; base.Activate(); } } base.WndProc(ref m); } private bool CreateBrowser() { CefSettings cefSettings = new CefSettings(); cefSettings.PackLoadingDisabled = false; cefSettings.LogSeverity = LogSeverity.Disable; cefSettings.BrowserSubprocessPath = this.assemblyDirectory + "\\CefSharp.BrowserSubprocess.exe"; cefSettings.CachePath = this.configuration.CachePath; cefSettings.IgnoreCertificateErrors = false; cefSettings.PersistSessionCookies = true; //Cef.EnableHighDPISupport(); //CefSharpSettings.LegacyJavascriptBindingEnabled = true; CefSharpSettings.WcfTimeout = TimeSpan.Zero; bool flag = !Cef.IsInitialized; if (flag) { bool flag2 = !Cef.Initialize(cefSettings); if (flag2) { MessageBox.Show("Failed to initialize the document browser component"); return false; } } string text = ( this.configuration.Url.StartsWith("http") ? this.configuration.Url : Path.Combine(this.assemblyDirectory, this.configuration.Url) ); this.browser = new ChromiumWebBrowser(text, null); //this.browser.BrowserSettings.FileAccessFromFileUrls = CefState.Enabled; //this.browser.BrowserSettings.UniversalAccessFromFileUrls = CefState.Enabled; this.browser .JavascriptObjectRepository .Register(this.configuration.Js2NetObjectName, this.functions, true, null); this.browser.BrowserSettings.Javascript = CefState.Enabled; this.browser.BrowserSettings.JavascriptCloseWindows = CefState.Enabled; this.browser.BrowserSettings.WebGl = CefState.Enabled; //this.browser.BrowserSettings.ApplicationCache = CefState.Disabled; this.browser.BrowserSettings.LocalStorage = CefState.Disabled; this.browser.BrowserSettings.Databases = CefState.Disabled; this.browser.LifeSpanHandler = new LifeSpanHandler(); this.browser.MenuHandler = new ContextMenuHandler(); this.browser.LoadingStateChanged += delegate( object sender, LoadingStateChangedEventArgs args ) { bool flag3 = !args.IsLoading; if (flag3) { base.Invoke( new MethodInvoker( delegate { this.loader.Visible = false; } ) ); } }; this.panelBrowser.Controls.Add(this.browser); return true; } private void Form_Browser_FormClosing(object sender, FormClosingEventArgs e) { bool flag = base.WindowState == FormWindowState.Normal; if (flag) { Settings.Default.WindowSize = base.Size; } else { Settings.Default.WindowSize = base.RestoreBounds.Size; } Settings.Default.Save(); } private void Form_Browser_FormClosed(object sender, FormClosedEventArgs e) { bool isInitialized = Cef.IsInitialized; if (isInitialized) { Cef.Shutdown(); } this.SendMessage("close:"); } private const int WM_COPYDATA = 74; private const int WM_CLOSE = 16; private const int MESSAGE_MAX_SIZE = 16777216; private string assemblyDirectory = Path.GetDirectoryName( new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath ); private Queue browserToRevitActions; private Queue revitToBrowserActions; private ChromiumWebBrowser browser = null; private Timer actionTimer = new Timer { Interval = 300 }; private readonly BrowserConfiguration configuration; private readonly BrowserFunctions functions; [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct MyStruct { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16777216)] public string Message; } internal struct COPYDATASTRUCT { public IntPtr dwData; public int cbData; public IntPtr lpData; } [SuppressUnmanagedCodeSecurity] internal class NativeMethod { [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern IntPtr SendMessage( IntPtr hWnd, int Msg, IntPtr wParam, ref BrowserForm.COPYDATASTRUCT lParam ); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", EntryPoint = "SetWindowLongPtr")] public static extern IntPtr SetWindowLongPtr64( IntPtr hWnd, int nIndex, IntPtr dwNewLong ); } } }