我在Windows窗体中获得了一个WebBrowser控件,我希望使用鼠标中键单击将新选项卡添加到我的浏览器中。唯一的问题是,每次我使用鼠标中键时,移动页面的箭头都会出现。
那么,我如何才能仅对我的链接上的点击禁用此移动/拖动命令呢?
发布于 2017-05-03 22:29:59
试试这个:这个解决方案有两个不同的部分。第一种方法非常简单-只需为浏览器控件的MouseDown事件设置一个事件处理程序:
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (webBrowser1.Document != null)
{
webBrowser1.Document.MouseDown += Document_MouseDown;
}
}
private void Document_MouseDown(object sender, HtmlElementEventArgs e)
{
if (e.MouseButtonsPressed == System.Windows.Forms.MouseButtons.Middle)
{
e.ReturnValue = false;
// Your custom code
}
}但也有一些大量使用javascript的网站无法使用此解决方案。对于这些,我找到了另一个解决方案,将javascript注入到文档中,这将防止鼠标中键点击:
HtmlElement head = browser.Document.GetElementsByTagName("head")[0];
HtmlElement mscript = browser.Document.CreateElement("script");
IHTMLScriptElement element = (IHTMLScriptElement)mscript.DomElement;
element.text = "function handleMouseEvent(e) { "
+ "var evt = (e==null ? event:e); "
+ "if ( e.which == 2 ) e.preventDefault(); "
+ "return true; } "
+ "document.onmousedown = handleMouseEvent; "
+ "document.onmouseup = handleMouseEvent; "
+ "document.onclick = handleMouseEvent; ";
head.AppendChild(mscript);更新
通过遵循仅使用托管代码执行此操作的建议方法:stackoverflow.com/a/6222430/1248295,可以改进JavaScript注入方法
这是用VB.NET编写的javascript注入的另一个示例实现:
Private ReadOnly handleMouseEventJs As String =
"
function HandleMouseEvent(e) {
var evt = (e==null ? event:e);
if (e.which == 2) e.preventDefault();
return true;
}
document.onmousedown = HandleMouseEvent;
// These events below seems are not necessary to handle for this purpose.
// document.onmouseup = HandleMouseEvent;
// document.onclick = HandleMouseEvent;
"
Private Sub WebBrowser1_Navigated(sender As Object, e As WebBrowserNavigatedEventArgs) _
Handles WebBrowser1.Navigated
Dim wb As WebBrowser = DirectCast(sender, WebBrowser)
Dim doc As HtmlDocument = wb.Document
Dim head As HtmlElement = doc.GetElementsByTagName("head")(0)
Dim js As HtmlElement = doc.CreateElement("script")
js.SetAttribute("text", handleMouseEventJs)
head.AppendChild(js)
' This method call seems not necessary at all, it works fine without invocking it.
' doc.InvokeScript("HandleMouseEvent", Nothing)
End Sub更新2
改为注入以下代码:
document.body.onmousedown = function(e) { if (e.button === 1) return false; }发布于 2012-10-20 03:41:59
鼠标中键单击时显示的移动图标受鼠标设置的控制。但是你可以检测到鼠标中键点击你的WebBrowser控件。
为WebBrowser控件注册DocumentCompleted事件并使用以下代码:
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
webBrowser1.Document.MouseDown += Document_MouseDown;
}
void Document_MouseDown(object sender, HtmlElementEventArgs e)
{
if (e.MouseButtonsPressed == System.Windows.Forms.MouseButtons.Middle)
{
// code to add tab or do sth else
}
}https://stackoverflow.com/questions/12978130
复制相似问题