Example #1
0
        /// <summary>
        /// Browser initialized changed event handler.
        /// </summary>
        /// <param name="sender">
        /// The sender.
        /// </param>
        /// <param name="eventArgs">
        /// The event args.
        /// </param>
        private void IsBrowserInitializedChanged(object sender, IsBrowserInitializedChangedEventArgs eventArgs)
        {
            if (eventArgs.IsBrowserInitialized)
            {
                var size = GetClientSize();
                Browser.SetSize(size.Width, size.Height);
                Browser.IsBrowserInitializedChanged -= IsBrowserInitializedChanged;
                Browser.GetBrowserHost().GetWindowHandle();

                if (_hostConfig.HostPlacement.Frameless && _hostConfig.HostPlacement.FramelessOptions.IsDraggable)
                {
                    ChromeWidgetMessageInterceptor.Setup(_interceptor, Handle, _hostConfig.HostPlacement.FramelessOptions, (message) =>
                    {
                        var msg = (WM)message.Value;
                        switch (msg)
                        {
                        case WM.LBUTTONDOWN:
                            User32Methods.ReleaseCapture();
                            NativeMethods.SendMessage(Handle, (int)WM.SYSCOMMAND, NativeMethods.SC_DRAGMOVE, 0);
                            break;
                        }
                    });
                }
            }
        }
Example #2
0
        private void ChromeBrowser_IsBrowserInitializedChanged(object sender, IsBrowserInitializedChangedEventArgs e)
        {
            if (e.IsBrowserInitialized)
            {
                OnUILoaded?.Invoke(this);
            }

            ChromeWidgetMessageInterceptor.SetupLoop(ChromeBrowser, (m) =>
            {
                if (m.Msg == WM_LBUTTONDOWN)
                {
                    Point point  = new Point(m.LParam.ToInt32());
                    lastLocation = point;
                    if (((DragDropHandler)ChromeBrowser.DragHandler).draggableRegion.IsVisible(point))
                    {
                        ReleaseCapture();
                        if (Window.InvokeRequired)
                        {
                            Window.Invoke(new SendHandleMessageDelegate(() => { SendMessage(Window.Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0); }));
                        }
                        else
                        {
                            SendMessage(Window.Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
                        }
                        Console.WriteLine("[WM_LBUTTONDOWN]");
                    }
                }
            });
        }
Example #3
0
 // 浏览器初始化完毕时执行
 private void Browser_onIsBrowserInitializedChanged(object sender, IsBrowserInitializedChangedEventArgs args)
 {
     if (args.IsBrowserInitialized)
     {
         // 监听 CefSharp 的 Windows Message
         ChromeWidgetMessageInterceptor.SetupLoop(browser, new Action <Message>(WndProc));
     }
 }
Example #4
0
        /// <summary>
        /// The ChromiumWebBrowserControl does not fire MouseEnter/Move/Leave events, because Chromium handles these.
        /// This method provides a demo of hooking the Chrome_RenderWidgetHostHWND handle to receive low level messages.
        /// You can likely hook other window messages using this technique, drag/drop etc
        /// </summary>
        private void SetupMessageInterceptor()
        {
            if (messageInterceptor != null)
            {
                messageInterceptor.ReleaseHandle();
                messageInterceptor = null;
            }

            IntPtr browserHandle = default(IntPtr);

            Invoke(new Action(() => {
                browserHandle = browser.Handle;
            }));

            Task.Run(() => {
                try {
                    while (true)
                    {
                        IntPtr chromeWidgetHostHandle;
                        if (ChromeWidgetHandleFinder.TryFindHandle(browserHandle, out chromeWidgetHostHandle))
                        {
                            messageInterceptor = new ChromeWidgetMessageInterceptor((Control)browser, chromeWidgetHostHandle, message => {
                                // Render process switch happened, need to find the new handle
                                if (message.Msg == ViewTools.WM_DESTROY)
                                {
                                    SetupMessageInterceptor();
                                    return;
                                }

                                if (message.Msg == ViewTools.WM_LBUTTONDOWN)
                                {
                                    Point point = new Point(message.LParam.ToInt32());
                                    // handdles moving the window via -webkit-app-region: drag;
                                    if (((DragHandler)browser.DragHandler).draggableRegion.IsVisible(point))
                                    {
                                        ViewTools.ReleaseCapture();

                                        this.InvokeOnUiThreadIfRequired(() => {
                                            Task.Run(() => ViewTools.SendMessage(Handle, ViewTools.WM_NCLBUTTONDOWN, ViewTools.HT_CAPTION, 0));
                                        });
                                    }
                                }
                            });

                            break;
                        }
                        else
                        {
                            // Chrome hasn't yet set up its message-loop window.
                            System.Threading.Thread.Sleep(10);
                        }
                    }
                } catch {
                    // Errors are likely to occur if browser is disposed, and no good way to check from another thread
                }
            });
        }
Example #5
0
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (components != null)
                {
                    components.Dispose();
                    components = null;
                }

                if (messageInterceptor != null)
                {
                    messageInterceptor.ReleaseHandle();
                    messageInterceptor = null;
                }
            }
            base.Dispose(disposing);
        }
Example #6
0
        // 浏览器初始化完毕时执行
        private void Browser_onIsBrowserInitializedChanged(object sender, IsBrowserInitializedChangedEventArgs args)
        {
            if (args.IsBrowserInitialized)
            {
                // 设置鼠标按下操作
                ChromeWidgetMessageInterceptor.SetupLoop(browser, (message) =>
                {
                    var dragHandler = (DragDropHandler)browser.DragHandler;

                    if (!dragHandler.Enable)
                    {
                        return;
                    }

                    Point point = new Point(message.LParam.ToInt32());
                    if (dragHandler.draggableRegion != null && dragHandler.draggableRegion.IsVisible(point))
                    {
                        // 若现在鼠标指针在可拖动区域内
                        if (message.Msg == (int)WindowMessages.WM_LBUTTONDBLCLK) // 鼠标左键双击
                        {
                            form.BeginInvoke((MethodInvoker) delegate
                            {
                                form.ToggleMaximize();
                            });
                        }
                        else if (message.Msg == (int)WindowMessages.WM_LBUTTONDOWN) // 鼠标左键按下
                        {
                            form.BeginInvoke((MethodInvoker) delegate
                            {
                                NativeMethods.ReleaseCapture();
                                NativeMethods.SendMessage(form.Handle, (int)WindowMessages.WM_NCLBUTTONDOWN, (int)HitTestValues.HTCAPTION, 0); // 执行 模拟标题栏拖动
                            });
                        }
                        else if (message.Msg == (int)WindowMessages.WM_RBUTTONDOWN) // 鼠标右键按下
                        {
                            form.BeginInvoke((MethodInvoker) delegate
                            {
                                form.ShowSystemMenu(point);
                            });
                        }
                    }
                });
            }
        }
Example #7
0
        /// <summary>
        /// The browser created.
        /// </summary>
        /// <param name="sender">
        /// The sender.
        /// </param>
        /// <param name="e">
        /// The e.
        /// </param>
        private void OnBrowserCreated(object sender, EventArgs e)
        {
            _browserWindowHandle = Browser.CefBrowser.GetHost().GetWindowHandle();
            if (_browserWindowHandle != IntPtr.Zero)
            {
                var size = GetClientSize();
                NativeMethods.SetWindowPos(_browserWindowHandle, IntPtr.Zero, 0, 0, size.Width, size.Height, WindowPositionFlags.SWP_NOZORDER);

                if (_hostConfig.HostPlacement.Frameless && _hostConfig.HostPlacement.FramelessOptions.IsDraggable)
                {
                    ChromeWidgetMessageInterceptor.Setup(_interceptor, Handle, _hostConfig.HostPlacement.FramelessOptions, (message) =>
                    {
                        var msg = (WM)message.Value;
                        switch (msg)
                        {
                        case WM.LBUTTONDOWN:
                            User32Methods.ReleaseCapture();
                            NativeMethods.SendMessage(Handle, (int)WM.SYSCOMMAND, NativeMethods.SC_DRAGMOVE, 0);
                            break;
                        }
                    });
                }
            }
        }
Example #8
0
        // 浏览器初始化完毕时执行
        private void Browser_onIsBrowserInitializedChanged(object sender, IsBrowserInitializedChangedEventArgs args)
        {
            if (args.IsBrowserInitialized)
            {
                // 监听 CefSharp 的 Windows Message
                ChromeWidgetMessageInterceptor.SetupLoop(browser, (message) =>
                {
                    var dragHandler = (DragDropHandler)browser.DragHandler;
                    if (!dragHandler.Enable)
                    {
                        return;
                    }

                    Point point = new Point(message.LParam.ToInt32());

                    // 指定区域拖拽
                    if (dragHandler.draggableRegion != null && dragHandler.draggableRegion.IsVisible(point))
                    {
                        // 若现在鼠标指针在可拖动区域内
                        if (message.Msg == (int)WindowMessages.WM_LBUTTONDBLCLK) // 鼠标左键双击
                        {
                            form.BeginInvoke((MethodInvoker) delegate
                            {
                                form.ToggleMaximize();
                            });
                        }
                        else if (message.Msg == (int)WindowMessages.WM_LBUTTONDOWN) // 鼠标左键按下
                        {
                            form.BeginInvoke((MethodInvoker) delegate
                            {
                                NativeMethods.ReleaseCapture();
                                NativeMethods.SendMessage(form.Handle, (int)WindowMessages.WM_NCLBUTTONDOWN, (int)HitTestValues.HTCAPTION, 0); // 执行 模拟标题栏拖动
                            });
                        }
                        else if (message.Msg == (int)WindowMessages.WM_RBUTTONDOWN) // 鼠标右键按下
                        {
                            form.BeginInvoke((MethodInvoker) delegate
                            {
                                form.ShowSystemMenu(point);
                            });
                        }
                    }
                    else
                    {
                        // 拖拽改变窗口大小
                        const uint HTLEFT        = 10;
                        const uint HTRIGHT       = 11;
                        const uint HTBOTTOMRIGHT = 17;
                        const uint HTBOTTOM      = 15;
                        const uint HTBOTTOMLEFT  = 16;
                        const uint HTTOP         = 12;
                        const uint HTTOPLEFT     = 13;
                        const uint HTTOPRIGHT    = 14;

                        const int RESIZE_HANDLE_SIZE = 5;

                        if (message.Msg == (int)WindowMessages.WM_MOUSEMOVE || message.Msg == (int)WindowMessages.WM_LBUTTONDOWN)
                        {
                            form.BeginInvoke((MethodInvoker) delegate
                            {
                                Size formSize = form.Size;
                                //Point screenPoint = new Point(message.LParam.ToInt32());
                                //Point clientPoint = form.PointToClient(screenPoint);

                                Dictionary <uint, Rectangle> boxes = new Dictionary <uint, Rectangle>()
                                {
                                    { HTBOTTOMLEFT, new Rectangle(0, formSize.Height - RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE) },
                                    { HTBOTTOM, new Rectangle(RESIZE_HANDLE_SIZE, formSize.Height - RESIZE_HANDLE_SIZE, formSize.Width - 2 * RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE) },
                                    { HTBOTTOMRIGHT, new Rectangle(formSize.Width - RESIZE_HANDLE_SIZE, formSize.Height - RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE) },
                                    { HTRIGHT, new Rectangle(formSize.Width - RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE, formSize.Height - 2 * RESIZE_HANDLE_SIZE) },
                                    { HTTOPRIGHT, new Rectangle(formSize.Width - RESIZE_HANDLE_SIZE, 0, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE) },
                                    { HTTOP, new Rectangle(RESIZE_HANDLE_SIZE, 0, formSize.Width - 2 * RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE) },
                                    { HTTOPLEFT, new Rectangle(0, 0, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE) },
                                    { HTLEFT, new Rectangle(0, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE, formSize.Height - 2 * RESIZE_HANDLE_SIZE) }
                                };

                                Dictionary <uint, Cursor> cursors = new Dictionary <uint, Cursor>()
                                {
                                    { HTBOTTOMLEFT, Cursors.SizeNESW },
                                    { HTBOTTOM, Cursors.SizeNS },
                                    { HTBOTTOMRIGHT, Cursors.SizeNWSE },
                                    { HTRIGHT, Cursors.SizeWE },
                                    { HTTOPRIGHT, Cursors.SizeNESW },
                                    { HTTOP, Cursors.SizeNS },
                                    { HTTOPLEFT, Cursors.SizeNWSE },
                                    { HTLEFT, Cursors.SizeWE }
                                };

                                // 判断此刻指针是否在 boxes 内
                                foreach (KeyValuePair <uint, Rectangle> hitBox in boxes)
                                {
                                    if (hitBox.Value.Contains(point))
                                    {
                                        browser.Cursor = cursors[hitBox.Key]; // 设置指针图标
                                        if (message.Msg == (int)WindowMessages.WM_LBUTTONDOWN)
                                        {
                                            NativeMethods.ReleaseCapture();
                                            NativeMethods.SendMessage(form.Handle, (int)WindowMessages.WM_NCLBUTTONDOWN, (int)hitBox.Key, 0);
                                        }
                                        break;
                                    }
                                }
                            });

                            return;
                        }
                    }
                });
            }
        }
Example #9
0
        private void OnIsBrowserInitializedChanged(object sender, IsBrowserInitializedChangedEventArgs args)
        {
            if (args.IsBrowserInitialized)
            {
                //Get the underlying browser host wrapper
                var    browserHost    = Browser.GetBrowser().GetHost();
                var    requestContext = browserHost.RequestContext;
                string errorMessage;
                // Browser must be initialized before getting/setting preferences
                var success = requestContext.SetPreference("enable_do_not_track", true, out errorMessage);
                if (!success)
                {
                    this.InvokeOnUiThreadIfRequired(() => MessageBox.Show("Unable to set preference enable_do_not_track errorMessage: " + errorMessage));
                }

                //Example of disable spellchecking
                //success = requestContext.SetPreference("browser.enable_spellchecking", false, out errorMessage);

                var preferences = requestContext.GetAllPreferences(true);
                var doNotTrack  = (bool)preferences["enable_do_not_track"];

                //Use this to check that settings preferences are working in your code
                //success = requestContext.SetPreference("webkit.webprefs.minimum_font_size", 24, out errorMessage);

                //If we're using CefSetting.MultiThreadedMessageLoop (the default) then to hook the message pump,
                // which running in a different thread we have to use a NativeWindow
                if (multiThreadedMessageLoopEnabled)
                {
                    Task.Run(() =>
                    {
                        try
                        {
                            while (true)
                            {
                                IntPtr chromeWidgetHostHandle;
                                if (ChromeWidgetHandleFinder.TryFindHandle(browserHandle, out chromeWidgetHostHandle))
                                {
                                    messageInterceptor = new ChromeWidgetMessageInterceptor((Control)Browser, chromeWidgetHostHandle, message =>
                                    {
                                        const int WM_MOUSEACTIVATE = 0x0021;
                                        const int WM_NCLBUTTONDOWN = 0x00A1;
                                        const int WM_LBUTTONDOWN   = 0x0201;

                                        if (message.Msg == WM_MOUSEACTIVATE)
                                        {
                                            // The default processing of WM_MOUSEACTIVATE results in MA_NOACTIVATE,
                                            // and the subsequent mouse click is eaten by Chrome.
                                            // This means any .NET ToolStrip or ContextMenuStrip does not get closed.
                                            // By posting a WM_NCLBUTTONDOWN message to a harmless co-ordinate of the
                                            // top-level window, we rely on the ToolStripManager's message handling
                                            // to close any open dropdowns:
                                            // http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/ToolStripManager.cs,1249
                                            var topLevelWindowHandle = message.WParam;
                                            PostMessage(topLevelWindowHandle, WM_NCLBUTTONDOWN, IntPtr.Zero, IntPtr.Zero);
                                        }
                                        //Forward mouse button down message to browser control
                                        //else if(message.Msg == WM_LBUTTONDOWN)
                                        //{
                                        //    PostMessage(browserHandle, WM_LBUTTONDOWN, message.WParam, message.LParam);
                                        //}

                                        // The ChromiumWebBrowserControl does not fire MouseEnter/Move/Leave events, because Chromium handles these.
                                        // However we can hook into Chromium's messaging window to receive the events.
                                        //
                                        //const int WM_MOUSEMOVE = 0x0200;
                                        //const int WM_MOUSELEAVE = 0x02A3;
                                        //
                                        //switch (message.Msg) {
                                        //    case WM_MOUSEMOVE:
                                        //        Console.WriteLine("WM_MOUSEMOVE");
                                        //        break;
                                        //    case WM_MOUSELEAVE:
                                        //        Console.WriteLine("WM_MOUSELEAVE");
                                        //        break;
                                        //}
                                    });

                                    break;
                                }
                                else
                                {
                                    // Chrome hasn't yet set up its message-loop window.
                                    Thread.Sleep(10);
                                }
                            }
                        }
                        catch
                        {
                            // Errors are likely to occur if browser is disposed, and no good way to check from another thread
                        }
                    });
                }
            }
        }