积极答复者
如何在BHO中捕获JavaScript对话框的内容

问题
-
怎么在自己编写的BHO中得到JavaScript弹出对话框的内容。
- 已移动 Sheng Jiang 蒋晟 2009年6月9日 16:22 IE开发问题 ([Loc]From:Visual C++)
答案
-
前面不是说了么,用你自己的函数覆盖掉windows的window对象的alert、confirm、showmodaldialog和showmodelessdialog。你想怎么提示用户或者统计就是你自己的事情了。你可以用window对象的IDispatchEx接口或者用javascript脚本来替换。
MSMVP VC++- 已标记为答案 Andrew_ZhuModerator 2009年6月16日 6:59
全部回复
-
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这个函数? -
用什么都会有内存泄漏,解决办法是不用ICustomDoc和IDocHostShowUI。你可以和javascript用的方法一样用自己的函数覆盖window对象的alert、confirm、showmodaldialog和showmodelessdialog。
你需要的帮助不是IE的DOM么?没觉得你需要COM或者VC方面的帮助。
MSMVP VC++
是这样的,我们目前要做的一个工作是对IE中的alert之类的对话框进行统计,并将统计结果写入到数据库中。是不能够修改WEB程序的。要通过外部的方法捕获到IE的alert窗口,并取得窗口中的内容。现在考虑的实现方式是通过自定义一个BHO组件来实现。 -
用什么都会有内存泄漏,解决办法是不用ICustomDoc和IDocHostShowUI。你可以和javascript用的方法一样用自己的函数覆盖window对象的alert、confirm、showmodaldialog和showmodelessdialog。
你需要的帮助不是IE的DOM么?没觉得你需要COM或者VC方面的帮助。
MSMVP VC++
是这样的,我们目前要做的一个工作是对IE中的alert之类的对话框进行统计,并将统计结果写入到数据库中。是不能够修改WEB程序的。要通过外部的方法捕获到IE的alert窗口,并取得窗口中的内容。现在考虑的实现方式是通过自定义一个BHO组件来实现。
或者说是要捕获到对话框的返回值,比如说是用户点击了确认或者取消按钮。 -
前面不是说了么,用你自己的函数覆盖掉windows的window对象的alert、confirm、showmodaldialog和showmodelessdialog。你想怎么提示用户或者统计就是你自己的事情了。你可以用window对象的IDispatchEx接口或者用javascript脚本来替换。
MSMVP VC++- 已标记为答案 Andrew_ZhuModerator 2009年6月16日 6:59
-
前面不是说了么,用你自己的函数覆盖掉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接口的问题,还望蒋老师指点一下。 -
在实现的过程中我使用了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.