none
如何在BHO中捕获JavaScript对话框的内容 RRS feed

答案

  • 前面不是说了么,用你自己的函数覆盖掉windows的window对象的alert、confirm、showmodaldialog和showmodelessdialog。你想怎么提示用户或者统计就是你自己的事情了。
    你可以用window对象的IDispatchEx接口或者用javascript脚本来替换。

    MSMVP VC++
    2009年6月10日 15:43

全部回复

  • 自己顶一下,盼高手指点。

    2009年6月9日 10:25
  • BHO可以访问DOM,和javascript调用的是同一套接口。如果javascript里面不能访问,那么BHO里面也不能访问。
    MSMVP VC++
    2009年6月9日 16:23
  • BHO可以访问DOM,和javascript调用的是同一套接口。如果javascript里面不能访问,那么BHO里面也不能访问。
    MSMVP VC++

    蒋老师,可不可以说的详细一些。我在网上搜索了一下,有说是可以使用IDocHostShowUI接口实现,不知道是不是可行。
    2009年6月10日 0:13
  • IDocHostShowUI可以捕获window.alert和window.confirm,不过不能捕获showmodaldialog和showmodelessdialog。 在托管代码中,IDocHostShowUI并不能可靠地捕获window.alert和window.confirm,因为mscorlib.dll里有个bug。 IDocHostShowUI不是为BHO设计的。在BHO里面用的话有内存泄漏
    MSMVP VC++
    2009年6月10日 0:22
  • IDocHostShowUI可以捕获window.alert和window.confirm,不过不能捕获showmodaldialog和showmodelessdialog。 在托管代码中,IDocHostShowUI并不能可靠地捕获window.alert和window.confirm,因为mscorlib.dll里有个bug。 IDocHostShowUI不是为BHO设计的。在BHO里面用的话有内存泄漏
    MSMVP VC++

    用VC的话会不会有内存泄漏?有没有其他的什么解决方案。

    另外,如果要用IDocHostShowUI接口来捕获alert的话,是否需要在ATL中从IDocHostShowUI和IDocHostUIHandler接口派生。如果是的话,这两个接口的虚函数都要在自己编写的类中实现,是否都简单的返回S_FALSE就可以了。还有就是捕获alert对话框的时候,是不是要重载ShowMessage这个函数?
    2009年6月10日 0:37
  • 自己顶一下吧。。。。

    这个帖子是不是放到VC++或者COM开发之类的论坛里好一些,麻烦斑竹给移下,谢谢。
    2009年6月10日 1:41
  • 用什么都会有内存泄漏,解决办法是不用ICustomDoc和IDocHostShowUI。你可以和javascript用的方法一样用自己的函数覆盖window对象的alert、confirm、showmodaldialog和showmodelessdialog。
    你需要的帮助不是IE的DOM么?没觉得你需要COM或者VC方面的帮助。

    MSMVP VC++
    2009年6月10日 2:49
  • 用什么都会有内存泄漏,解决办法是不用ICustomDoc和IDocHostShowUI。你可以和javascript用的方法一样用自己的函数覆盖window对象的alert、confirm、showmodaldialog和showmodelessdialog。
    你需要的帮助不是IE的DOM么?没觉得你需要COM或者VC方面的帮助。

    MSMVP VC++

    是这样的,我们目前要做的一个工作是对IE中的alert之类的对话框进行统计,并将统计结果写入到数据库中。是不能够修改WEB程序的。要通过外部的方法捕获到IE的alert窗口,并取得窗口中的内容。现在考虑的实现方式是通过自定义一个BHO组件来实现。
    2009年6月10日 2:54
  • 用什么都会有内存泄漏,解决办法是不用ICustomDoc和IDocHostShowUI。你可以和javascript用的方法一样用自己的函数覆盖window对象的alert、confirm、showmodaldialog和showmodelessdialog。
    你需要的帮助不是IE的DOM么?没觉得你需要COM或者VC方面的帮助。

    MSMVP VC++

    是这样的,我们目前要做的一个工作是对IE中的alert之类的对话框进行统计,并将统计结果写入到数据库中。是不能够修改WEB程序的。要通过外部的方法捕获到IE的alert窗口,并取得窗口中的内容。现在考虑的实现方式是通过自定义一个BHO组件来实现。

    或者说是要捕获到对话框的返回值,比如说是用户点击了确认或者取消按钮。
    2009年6月10日 3:15
  • 前面不是说了么,用你自己的函数覆盖掉windows的window对象的alert、confirm、showmodaldialog和showmodelessdialog。你想怎么提示用户或者统计就是你自己的事情了。
    你可以用window对象的IDispatchEx接口或者用javascript脚本来替换。

    MSMVP VC++
    2009年6月10日 15:43
  • 前面不是说了么,用你自己的函数覆盖掉windows的window对象的alert、confirm、showmodaldialog和showmodelessdialog。你想怎么提示用户或者统计就是你自己的事情了。
    你可以用window对象的IDispatchEx接口或者用javascript脚本来替换。

    MSMVP VC++
    蒋老师,可不可以说的详细一些。
    我查了下MSDN,说是用IDocHostShowUI接口的ShowMessage可以得到对话框的标题和内容等信息,但是说必须要实现IOleClientSite和IOleDocumentSite才可以。
    我想在ATL中实现这个接口,但是不知道怎么将以上这三个接口同IWebBrowser2接口关联。
    我写了一个Demo,部分代码如下:
    class ATL_NO_VTABLE CTestBHO :
     public CComObjectRootEx<CComSingleThreadModel>,
     public CComCoClass<CTestBHO, &CLSID_TestBHO>,
     public IObjectWithSiteImpl<CTestBHO>,
     public IDispatchImpl<ITestBHO, &IID_ITestBHO, &LIBID_TestLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
     public IDispEventImpl<1, CTestBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>,
     public IDocHostShowUI,
     public IDocHostUIHandler
    {
     。。。。
    }

    在这个Demo中,IDocHostShowUI中的ShowMessage函数不管怎么测试都没有响应。不知道是不是因为没有实现IOleClientSite和IOleDocumentSite接口的问题,还望蒋老师指点一下。
    2009年6月11日 0:16
  • 不是说用ICustomDoc么
    MSMVP VC++
    2009年6月11日 1:58
  • 在实现的过程中我使用了ICustomDoc的SetUIHandler,代码如下:
    if( m_spWebBrowser ){  
      CComPtr<IDispatch>   spDoc;  
      m_spWebBrowser->get_Document(&spDoc);  
       
      if( spDoc ){  
       CComQIPtr<ICustomDoc,&IID_ICustomDoc>   spCustomDoc(spDoc);  
       if( spCustomDoc ){
        spCustomDoc->SetUIHandler(this);
       }
      }  
     }
    但是这么做以后,IDocHostUIHandler的方法倒是可以响应,IDocHostShowUI的两个方法都没有响应。不知道我这么做是不是有问题。

    对于IDocHostShowUI这个接口,MSDN上是这样写的:
    MSHTML obtains an IDocHostShowUI interface by calling the host client site's QueryInterface method, requesting IID_IDocHostShowUI. The site is the object that implements the IOleDocumentSite and IOleClientSite interfaces.

    2009年6月11日 2:07
  • 这些OLE接口都不是为BHO设计的,是为了浏览器控件和宿主通讯而设计的。
    MSMVP VC++
    2009年6月11日 14:41
  • 蒋老师,你的意思是在BHO中无法实现IDocHostShowUI接口了。
    还有其他的方法可以在BHO中获得alert的窗口内容吗?

    2009年6月11日 14:46
  • 你可以和javascript用的方法一样用自己的函数覆盖window对象的alert、confirm、showmodaldialog和showmodelessdialog。你可以用window对象的IDispatchEx接口或者用javascript脚本来替换。
    MSMVP VC++
    2009年6月11日 15:56
  • 是在BHO中实现IDispatchEx接口吗,怎么才能够通过IDispatchEx捕获到alert的对话框呢。
    比如在IE的地址栏上输入:javascript:alert('test'),然后在BHO中可以捕获到文本"test”。如何才能够在弹出对话框的时候响应到这个事件呢,捕获到事件以后又怎么取道文本"test"。

    2009年6月11日 16:08
  • 用IDispatchEx增加一个类型为IDispatch的属性,在IDispatch的Invoke里面显示一个对话框。
    用脚本来做的话,是声明一个myalert函数,然后设置window.alert=myalert;这样调用alert的时候就是调用你的alert了。

    MSMVP VC++
    2009年6月11日 17:00
  • 蒋老师,可能是我没有将这个问题解释清楚。我想实现BHO捕获IE对话框内容,是想做一个通用的解决方案。WEB程序不是我写的,我没有办法更改脚本内容。所以才希望做一个BHO来解决这个问题。
    2009年6月12日 0:03