private ChromeWidgetMessageInterceptor(IntPtr window, IntPtr childHandle, IFramelessOptions framelessOptions, Action <Message> forwardAction) { _parentHandle = window; _childHandle = childHandle; _childWndProc = WndProc; _framelessOptions = framelessOptions; _childWndProcHandle = Marshal.GetFunctionPointerForDelegate(_childWndProc); _oldWindProc = NativeMethods.SetWindowLongPtr(_childHandle, (int)WindowLongFlags.GWLP_WNDPROC, _childWndProcHandle); NativeMethods.SetWindowLongPtr(_childHandle, (int)WindowLongFlags.GWLP_USERDATA, _oldWindProc); _forwardAction = forwardAction; }
/// <summary> /// Asynchronously wait for the Chromium widget window to be created for the given ChromiumWebBrowser, /// and when created hook into its Windows message loop. /// </summary> /// <param name="window">The browser window to intercept Windows messages for.</param> /// <param name="framelessOptions">The frameless options.</param> /// <param name="forwardAction">This action will be called whenever a Windows message is received.</param> internal static void Setup(IntPtr window, IFramelessOptions framelessOptions, Action <Message> forwardAction) { Task.Run(() => { try { bool foundWidget = false; while (!foundWidget) { if (ChromeWidgetHandleFinder.TryFindHandle(window, out var chromeWidgetHostHandle)) { foundWidget = true; new ChromeWidgetMessageInterceptor(window, chromeWidgetHostHandle, framelessOptions, forwardAction); } else { // Chrome hasn't yet set up its message-loop window. Thread.Sleep(10); } } } catch { } }); }
public static ChromelyConfiguration WithFramelessOptions(this ChromelyConfiguration configuration, IFramelessOptions framelessOptions) { if (configuration != null) { if (configuration.HostPlacement == null) { throw new Exception("HostPlacement cannot be null."); } configuration.HostPlacement.FramelessOptions = framelessOptions; } return(configuration); }