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;
}
}
}
我想在 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;
}
}
}