如何禁用WebBrowser鼠标中键单击自动滚动?

时间:2011-04-09 01:16:04

标签: c# .net winforms

我正在尝试设置WebBrowser,我可以通过鼠标中键点击链接打开新标签。

首先尝试了WebBrowser和WebBrowser.Document的Click / MouseDown事件,这些事件仅在左键单击时触发。然后我尝试在WebBrowser上覆盖WndProc过程,在那里遇到了我的问题。我可以通过这种方式获得鼠标中键,然后点击链接进入链接,但它也会开始自动滚动。还试图看看我是否可以在WebBrowser.Document上覆盖WndProc,但它是一个密封的类。

我已经尝试过寻找WebBrowser组件的替代品,因为我首先使用它并不是很满意。替换它的选项似乎似乎是打包webkit / gecko或者在html渲染组件的顶部构建我自己的浏览器。我不喜欢webkit / gecko,因为它增加了程序的额外大小。我找到一个能够满足我想要的HTML渲染组件并没有太多运气。

1 个答案:

答案 0 :(得分:0)

我知道这是超级老,但我最近很难弄清楚如何做到这一点,并认为我会分享。该解决方案有两个不同的部分。第一个很简单 - 只需为浏览器控件的MouseDown事件设置一个事件处理程序:

browser.Document.MouseDown += new HtmlEventHandler(Browser_MouseDown);

void Browser_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);

我把它放在webbrowser控件的DocumentCompleted事件上。上述解决方案似乎阻止了所有站点上的默认中键单击操作。