c# - WebBrowser 控件禁用鼠标点击

标签 c# winforms webbrowser-control

我想在 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 面板的自定义控件,已修改为完全透明但“实体”(接收鼠标事件)。

透明度是通过使用 CreateParams 实现的添加 ExStyle = WS_EX_TRANSPARENT;

此外,Control.SetStyle()方法用于修改控制行为,添加这些 ControlStyles :

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

自定义控件通过传递它必须覆盖的控件的引用来初始化。然后,它会将自身大小调整为该引用控件的大小,并将 ScrollBar 排除在该度量之外,以便可以使用它们。

<小时/> 要使其正常工作,请创建对 OverlayPanel 类的引用并调用辅助方法 CreateOverlay(Control control):

private OverlayPanel overlayPanel;

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

OverlayPanel 类代码可以插入到 Form 或它自己的类文件中。
当 Form 中的所有控件都已经设置了尺寸时,应该创建它: 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;
        }
    }
}

关于c# - WebBrowser 控件禁用鼠标点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51425168/

相关文章:

c# - 通过两个不同的接口(interface)访问同一个对象

c# - 创建一副简单的纸牌 C#

c# - 防止将数字粘贴到 .net Windows 窗体中的文本框中

c# - Entity Framework 将项目添加到 ICollection 错误

c# - 推送通知无法使用 asp.net 到达 ios 设备?

c# - 按带小数的字母数字排序列表

c# - Winforms 设计器 : Modify (and keep) properties in sub objects

.net - WinForms Web 浏览器控件 : Force all links to open externally in a new (IE) window

c# - 可以处理 HTTPS 的 WebBrowser 控件

c# - c# 应用程序的轻量级浏览器控件