Skip to main content
 首页 » 编程设计

c#之如何禁用 WebBrowser 鼠标中键单击自动滚动

2024年01月12日26虾米姐

我正在尝试设置一个 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 事件上。上述解决方案似乎阻止了所有网站上的默认中键点击操作。