WebBrowser 控件禁用鼠标单击

WebBrowser Control disable mouse clicks

我想在 WebBrowser 控件中显示 YouTube 视频,但我想禁用所有用户交互(无鼠标点击,无键盘事件...)。

我正在捕获所有控件的预览、鼠标和键盘事件,而且我将一些处理程序放入加载的 HTML 文档,但没有任何成功:

 void webBrowser1_DocumentCompleted( object sender, WebBrowserDocumentCompletedEventArgs e )
 {
     if(webBrowser1.Document != null) {
         var doc = webBrowser1.Document;
         
         doc.Body.Style = "overflow:hidden";
         doc.Click      += htmlDoc_Click;
         doc.MouseDown  += htmlDoc_MouseDown;
         doc.MouseMove  += htmlDoc_MouseMove;
             
         webBrowser1.Document.Body.Click     += new HtmlElementEventHandler(htmlDoc_Click);
         webBrowser1.Document.Body.MouseDown += new HtmlElementEventHandler(Document_MouseDown);
         webBrowser1.Document.Body.MouseUp   += new HtmlElementEventHandler(Document_MouseMove);
         webBrowser1.Document.Body.MouseUp   += new HtmlElementEventHandler(Document_MouseUp);
         
         
         HtmlElement head = doc.GetElementsByTagName("head")[0];
         HtmlElement mscript = doc.CreateElement("script");
         IHTMLScriptElement element = (IHTMLScriptElement)mscript.DomElement;
         element.text = "function handleMouseEvent(e) { "
                      + "var evt = (e==null ? event:e); "
                      + "return true; } "
                      + "document.onmousedown = handleMouseEvent; "
                      + "document.onmouseup   = handleMouseEvent; "
                      + "document.onclick     = handleMouseEvent; ";
         head.AppendChild(mscript);
     }
 }

也可以在 WebBrowser 控件“前面”覆盖一个透明控件。

这是从标准 WinForms 面板派生的自定义控件,修改为完全透明但 "solid"(接收鼠标事件)。

使用 CreateParams 添加 ExStyle = WS_EX_TRANSPARENT;

实现透明度

此外,Control.SetStyle() method is used to modify the control behaviour, adding these ControlStyles:

ControlStyles.Opaque 阻止绘制控件 BackGround,因此它不受系统管理。
ControlStyles.SupportsTransparentBackColor 允许控件接受其背景颜色的 Alpha 值。
ControlStyles.ResizeRedraw 导致控件在调整大小时重绘。

自定义控件已初始化,将控件的引用传递给覆盖。然后它将自身调整为此引用控件的大小,从该度量中排除滚动条,以便可以使用它们。


要设置它工作,请创建对 OverlayPanel class 的引用并调用辅助方法 CreateOverlay(Control control):

private OverlayPanel overlayPanel;

private void CreateOverlay(Control control)
{
    overlayPanel = new OverlayPanel(this.webBrowser1);
    Controls.Add(overlayPanel);
    overlayPanel.BringToFront();
}

OverlayPanel class 代码可以插入到表单中或插入到它自己的 class 文件中。
它应该在所有控件都在一个文件中时创建表单已经设置了尺寸:在 Form.Shown() 事件中或父表单可见的任何其他时间。无论如何,Form.Load() 事件在大多数情况下也可能有效。

请注意,此 OverlayPanel 目前没有 Resize 方法,如果覆盖控件在某些时候调整大小时需要该方法。但它是一个非常简单的实现,如果需要的话。

private class OverlayPanel : Panel
{
    internal int WS_EX_TRANSPARENT = 0x00000020;
    public OverlayPanel(Control RefControl)
    {
        InitializeComponent();
        this.Size = new Size(RefControl.Size.Width - SystemInformation.VerticalScrollBarWidth,
                             RefControl.Size.Height - SystemInformation.HorizontalScrollBarHeight);
        this.Location = RefControl.Location;
    }
    private void InitializeComponent()
    {
        this.SetStyle(ControlStyles.Opaque | 
                      ControlStyles.ResizeRedraw |
                      ControlStyles.SupportsTransparentBackColor, true);
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer, false);
        this.BorderStyle = BorderStyle.None;
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams parameters = base.CreateParams;
            parameters.ExStyle |= WS_EX_TRANSPARENT;
            return parameters;
        }
    }
}