我正在尝试设置一个 WebBrowser,我可以在其中通过鼠标中键单击链接来打开新选项卡。
首先尝试了 WebBrowser 和 WebBrowser.Document 的 Click/MouseDown 事件,它们只在左键单击时触发。然后我尝试在遇到问题的 WebBrowser 上覆盖 WndProc 过程。我可以通过这种方式按下鼠标中键,然后点击链接,但它也会开始自动滚动。还尝试查看我是否可以覆盖 WebBrowser.Document 上的 WndProc,但它是一个密封类。
我曾尝试寻找 WebBrowser 组件的替代品,因为一开始我对使用它并不完全满意。替换它的选项似乎是打包 webkit/gecko 或在 html 呈现组件之上构建我自己的浏览器。我不太喜欢 webkit/gecko,因为它给程序增加了额外的大小。我不太幸运地找到了一个 html 呈现组件来执行我想要的操作。
请您参考如下方法:
我知道这太老了,但我最近很难弄清楚如何做到这一点,我想我会分享。这个解决方案有两个不同的部分。第一个非常简单 - 只需为浏览器控件的 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 注入(inject)文档,这将阻止中间单击:
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 事件上。上述解决方案似乎阻止了所有网站上的默认中键点击操作。
