如何检测WebBrowser控件中的javascript执行

我的C#应用​​程序中有一个WebBrowser控件。 webbrowser在用户的控制之下,也就是说,他可以加载他的计算机可以在Web上访问的任何网页(当然受到代理,主机文件等的限制)。

我需要知道并在webbrowser组件中加载的页面内有javascript调用时收到通知。

第一个例子:给出这样的链接

 test 

当用户点击链接时,我需要知道已经调用了函数“jsFunct”。

第二个例子:给出一个叫做的电话

  window.setTimeout("jsFunct()", 1000);  

我需要知道,在执行脚本1秒后,调用了函数jsFunct。

最好的方法是在调用函数时触发事件。 如果事件可以执行javascript代码,或者至少是参数中的函数名称,那也会很棒。

编辑:

即使问题与webbrowser组件有关,任何允许用户检测javascript激活(甚至通过js)的东西也没关系,能够注入处理javascript事件的js并将其传递给触发某些事件的wb控件它可以处理。

在JavaScript中触发全局函数时,可以使用window.external调用C#方法。 有关window.external的详细信息,请参阅WebBrowser控件概述 。

您需要设置ObjectForScripting: Webbrowser控件的window.external始终为null。 为了这个工作。

以@Krishna的答案来添加JavaScript(但删除jQuery因为它不需要):

 private void addScript(HtmlElement head, string scriptSource) { HtmlElement lhe_script = head.Document.CreateElement("script"); IHTMLScriptElement script = (IHTMLScriptElement)lhe_script.DomElement; script.src = scriptSource; head.AppendChild(lhe_script); } addScript(WebBrowser.Head, @"InjectMonitor.js"); 

下面的JavaScript(InjectMonitor.js)将找到所有全局函数并附加指定的处理程序:

 function augment(withFn) { var name, fn; for (name in window) { fn = window[name]; if (typeof fn === 'function') { window[name] = (function(name, fn) { var args = arguments; return function() { withFn.apply(this, args); fn.apply(this, arguments); }; })(name, fn); } } } augment(function(name, fn) { console.log("calling " + name, fn); // window.external.yourC#method }); 

在此示例中,从添加控制台日志到每个function ,它只是将呼叫记录到控制台; 但是使用window.external,您可以将一些消息发送回您的C#应用​​程序,其中包含从客户端调用的函数的详细信息。

最后,这是一个JS Bin示例(运行它,不要忘记控制台): JS Bin示例

在webbrowser加载事件中,

  1. 注入Jquery
  2. 注入监视器脚本

 private void addScript(HtmlElement head, string scriptSource) { HtmlElement lhe_script = head.Document.CreateElement("script"); IHTMLScriptElement script = (IHTMLScriptElement)lhe_script.DomElement; script.src = scriptSource; head.AppendChild(lhe_script); } addScript(Webbrowser.Head, @"jquery.min.js"); addScript(WebBrowser.Head, @"InjectMonitor.js"); 

你的文件InjectMonitor.js应该是这样的

  $(document).ready(function () { //Add click event for every anchor on the page loaded- note this merely alerts text on click. you can however add your own function $("a").click(function (e) { alert($(this).text()); return false;}) }); 

那么克里希纳已经回答的是纯粹的javascript附加到事件的内容,但是我看到你可能需要将它附加到所有标签(a,p,div,输入)等以及附加到每个标签的所有事件。

我相信另一种方法是使用.net中可用的BHO(浏览器帮助对象),如果没有,你擅长VC ++和MFC,你也可以使用Windows Hooks。