我正在尝试设置WebBrowser,我可以通过鼠标中键点击链接打开新标签。
首先尝试了WebBrowser和WebBrowser.Document的Click / MouseDown事件,这些事件仅在左键单击时触发。然后我尝试在WebBrowser上覆盖WndProc过程,在那里遇到了我的问题。我可以通过这种方式获得鼠标中键,然后点击链接进入链接,但它也会开始自动滚动。还试图看看我是否可以在WebBrowser.Document上覆盖WndProc,但它是一个密封的类。
我已经尝试过寻找WebBrowser组件的替代品,因为我首先使用它并不是很满意。替换它的选项似乎似乎是打包webkit / gecko或者在html渲染组件的顶部构建我自己的浏览器。我不喜欢webkit / gecko,因为它增加了程序的额外大小。我找到一个能够满足我想要的HTML渲染组件并没有太多运气。
答案 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事件上。上述解决方案似乎阻止了所有站点上的默认中键单击操作。