WebBrowser控件禁用鼠标点击

3

我希望在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控件的前面叠加一个透明的控件也是可以的。


1
绑定鼠标和键盘事件,并在按键按下事件中设置 e.Handled = True;e.SuppressKeyPress = True - Sasha
@Jaxi:问题在于YouTube没有触发任何事件。 - muffmolch
1个回答

2
这是一个自定义控件,派生自标准 WinForms 面板,并修改为完全透明但“实体”(接收鼠标事件)。
透明度是通过使用 CreateParams 添加 ExStyle = WS_EX_TRANSPARENT 来实现的。
此外,Control.SetStyle() 方法用于修改控件的行为,添加这些 ControlStyles

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

自定义控件通过传递一个需要覆盖的控件的引用进行初始化。然后,它会调整自身大小以适应该引用控件的大小,但不包括滚动条在内,以便可以使用它们。

要使其工作,请创建对OverlayPanel类的引用,并调用辅助方法CreateOverlay(Control control):
private OverlayPanel overlayPanel;

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

OverlayPanel类的代码可以插入到一个表单或它自己的类文件中。
应该在所有控件的尺寸都已设置好的情况下创建它:在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;
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接