我想在 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/