IE编程.docx
- 文档编号:30215076
- 上传时间:2023-08-07
- 格式:DOCX
- 页数:27
- 大小:154.01KB
IE编程.docx
《IE编程.docx》由会员分享,可在线阅读,更多相关《IE编程.docx(27页珍藏版)》请在冰豆网上搜索。
IE编程
如你所知,InternetExplorer像其他COM对象一样激发事件—通过连接点.但实际上InternetExplorer如何激发事件呢?
每次InternetExplorer需要向客户提供关于当前活动状态的信息,InternetExplorer激发通过DWebBrowserEvents2连接点激发一个事件.(之前到版本4,InternetExplorer通过DWebBrowserEvents接口激发事件.但到了版本4.x和5,InternetExplorer通过DWebBrowserEvents2连接点.)
注意
如何领会到InternetExplorer加法那些事件?
最佳途径是MSDNOnlineWebWorkshop.另外采用OLE-COMObjectViewer
不像WebBrowser控件和InternetExplorer的其他接口,是剑接口没有继承体系.DWebBrowserEvents接口严格应用于InternetExplorer3.如果你正宿主WebBrowser控件或者自动化InternetExplorer5,你可以通过此接口接收事件—但是不可挂接.DWebBrowserEvents2接口包含的方法是为InternetExplorer5定制的.用DWebBrowserEvents2替代DWebBrowserEvents,你将有更多的控制能力.所以不要忘记接口的最后面的2.
尽管DWebBrowserEvents2是一个事件接口,它其实就是像IWebBrowser2 一样的另外COM接口,所以它可以包含方法.(D开头的命名是表示这是派遣接口.一个派遣接口是一个IDispatch接口.但不同于普通接口,派遣接口没有vtable.)就像一个接口一样,派遣接口只不过提供一些函数的定义—他们并不真实实现.事件的实现由客户提供.举例来说,为了让WebBrowser激发一个事件,在DWebBrowserEvents2接口中适当定义一些方法.这些方法由客户实现.但WebBrowser不直接调用这些方法.换句话讲,WebBrowser并不调用DocumentComplete方法.因为DWebBrowserEvents2是派遣接口,WebBrowser通过IDispatch:
:
Invoke调用客户的实现.早期,当WebBrowser调用客户的Invoke实现,WebBrowser传递事件被激发的DISPID.
注意
某些工具如VisualBasic,MFC,和ATL提供Invoke实现
表7-6列出WebBrowser事件.(这些是WebBrowser控件和InternetExplorer供有的事件,尽管有些事件仅仅用于自动化InternetExplorer).
注意
尽管有些方法为不包含2.尽管DWebBrowserEvents2并非继承自WebBrowserEvents,DWebBrowserEvents2还是匹配DWebBrowserEvents中被更改的,以免混淆。
注意表7-6重的参数有些值同样有VARIANT_TRUE或VARIANT_FALSE.如果你使用VisualC++,确信分派使用这些值不要使用TRUE或FALSE.如果你使用VisualBasic,它会自动帮助你转换,你可以比较True和False.
现在来仔细看看这些事件
Table7-6WebBrowser事件
私有事件
描述
BeforeNavigate2
在导航之前发生.(该事件并不在不刷新页面的时候发生)
CommandStateChange
当命令状态改变时发生.该事件告诉你何时使能或者禁止Back以及Forward菜单像或者按钮.
DocumentComplete
当整个文档完全完成装载时发生.如果你刷新页面,此事件并不激发.
DownloadBegin
当一个下载项目开始时候发生,此事件也在你刷新(IWebBrowser2:
:
Refresh.)时发生
DownloadComplete
党整个下载项目完成是发生该事件也发生在完成刷新页面.
NavigateComplete2
当整个导航完成.该事件对应于BeforeNavigate2.
NewWindow2
在一个新的窗口被创建以显示Web页或者其他资源的时候发生。
譬如你在页面中以新建窗口的方式打开一个连接
OnFullScreen
当FullScreen属性被改变时候发生.此事件携带一个VARIANT_BOOL类型的输入参数指示InternetExplorer是否处于全屏(full-screen)模式(VARIANT_TRUE)或者处于普通模式(VARIANT_FALSE).
OnMenuBar
菜单条MenuBar属性被改变的时候发生.一个VARIANT_BOOL类型的输入参数指 InternetExplorer的菜单条属性是可见(VARIANT_TRUE)或者隐藏(VARIANT_FALSE).
OnQuit
当InternetExplorer正在退出时发生.该事件当用户关闭浏览器或者调用Quit方法.
OnStatusBar
当StatusBar属性被改变的时候发生。
事件携带VARIANT_BOOL类型的输入参数指示InternetExplorer的状态条是否可见(VARIANT_TRUE)或者隐藏(VARIANT_FALSE).
OnTheaterMode
当TheaterMode属性被改变时发生.事件携带VARIANT_BOOL类型的输入参数指示InternetExplorer的状态条是否可见(VARIANT_TRUE)或者隐藏(VARIANT_FALSE).
OnToolBar
当ToolBar属性被改变时发生.事件携带VARIANT_BOOL类型的输入参数指示InternetExplorer的状态条是否可见(VARIANT_TRUE)或者隐藏(VARIANT_FALSE).
OnVisible
当WebBrowser将被显示或者隐藏时发生。
.事件携带VARIANT_BOOL类型的输入参数指示InternetExplorer的状态条是否可见(VARIANT_TRUE)或者隐藏(VARIANT_FALSE).
ProgressChange
当下载进度被更新时候发生
PropertyChange
当属性改变时候发生。
典型的,当PutProperty方法被调用时
StatusTextChange
InternetExplorer和WebBrowser控件改变状态条时候发生。
即使webbrowser控件没有状态条。
StatusTextChange给客户一个改变状态条的机会
TitleChange
.当文档对象的title可用或者改变的时候发生
BeforeNavigate2
BeforeNavigate2就像字面上所说.当InternetExplorer导航到一个WEB页是激发;因此,当用户输入一个URL,点击Back或者Forward按钮,或者处理一个导航时都会发生.BeforeNavigate2 也在WebBrowser控件导航类方法调用时发生,例如Navigate,Navigate2,GoHome,或者GoSearch.也许,该事件不会在你刷新页面时发生.如果页面上有帧,BeforeNavigate2将像顶级窗口一样被激发.BeforeNavigate2由7个输入参数,见7-7.
Table7-7InputParametersoftheBeforeNavigate2Event
Parameter
Description
pDisp
将发生导航的顶级窗口或者帧的Idispatch接口的地址
URL
将导航至的URL
Flags
保留
TargetFrameName
显示资源的窗口或者帧的名字字符串,或者为NULL(如果没有命名)
PostData
HTTPPOST传输的数据地址
Headers
增加的将要发给服务器的HTTP头.一般HTTP头指定其它的服务器要求。
传送给服务器的数据类型、状态马等
Cancel
cancel标志的地址.设置为TRUE可取消导航
注意打所属参数匹配于Navigate或者Navigate2的调用参数.如果BeforeNavigate2由一个或者多个导航类调用激发,这些导航类的方法参数传递到BeforeNavigate2方法.
在事件的句柄函数中,你可以使用Cancel参数取消导航,或者你可以是用pDisp参数修改导航目的.设置Cancel参数为VARIANT_TRUE可以取消导航,如果你想,你可以通过pDisp修改参数导航信息且导航到另外的位置.举例来说,如果我们向停止当前导航,增加一些头信息,且导航到原先的URL.在VisualBasic,我们可以如下代码实现:
我们需要注意以上代码的几个重点.
首先你必须检查pDisp的类型使之确定为WebBrowser.当页面包含帧,pDisp可能不是WebBrowser对象由此一些导航会导致错误.
其次你必须检查确信Headers参数是空字符串以避免无限循环.记住BeforeNavigate2每一次导航都会发生.因此如果你在BeforeNavigate2事件处理中调用Navigate,另外一次BeforeNavigate2将被激活.在前面的代码中,仅仅在Headers参数为空才调用Navigate避免了无限循环.如果Headers参数是空,Navigate将携带非空的Headers参数.下一次BeforeNavigate2北激活,Headers将不为空;此时,我们千万不可再次Navigatea,从而导致一个无限循环.
第三点你必须调用pDisp的Stop方法.如果你没做到这点,"about:
NavigationCanceled"Web页将会载你首次取消掉导航时被显示.
CommandStateChange
CommandStateChange是当InternetExplorer想通知一个应用程序WebBrowser命令状态已经改变时激发.当检测到Forward和Back菜单项和按钮禁止或者使能时激发此事件.
CommandStateChange事件有2个参数,Command和Enable。
Command输入参数将要改变状态的按钮的表示符,可以取值—CSC_NAVIGATEFORWARD和CSC_NAVIGATEBACK分别表示是Forward按钮项和Back项,每次导航发生,CommandStateChange事件发生并告诉你Forward或者Back菜单项以及按钮将使能或禁止.举例来说,如果没有Web页在当前导航后发生,Command的值应该为CSC_NAVIGATEFORWARD,并且Enable参数将等于VARIANT_FALSE.
第二个参数,Enable,如果命令可用(使能)则为VARIANT_TRUE,如果禁止则值为VARIANT_FALSE.
为说明问题,我们看看代码。
一下代码为定义事件接收的宏声明:
重要的一点是要通过WebBrowser控件的Create方法来创建.ON_EVENT的第二个参数为你宿主的WebBrowser控件的IID.之前的例子中是NULL.你必须为webbrowser控件声明一个ID且用此ID创建实例.如果不这么做,事件将不会正确工作.
你可以在工程的任何文件定义此ID.(推荐在资源头文件resource.h.)因为最大的资源Id是32,779,所以你可以如下定义WebBrowser控件的ID:
#defineIDC_WEBBROWSER 35000
此数高于resource.h中的任何资源ID,因此可以确信ID数字不会同采用ClassWizard添加的ID冲突.现在可以采用使用ID的Create方法来创建WebBrowser控件:
if(!
m_webBrowser.Create(NULL,WS_CHILD|WS_VISIBLE,
CRect(),this,IDC_WEBBROWSER))
{
return-1;
}
下一步声明OnCommandStateChange方法,该方法将在WebBrowser控件激发CommandStateChange事件时被调用.可声明如下:
voidOnCommandStateChange(longlCommand,BOOLbEnable);
在OnCommandStateChange方法的是现代码中,设定表示GoForward或者GoBack想得导航菜单项的数据成员为使能或者禁止.该书据成员将被UPDATE_COMMAND_UI句柄使用。
以下为OnCommandStateChange方法实现:
声明m_fForwardEnabled和m_fBackEnabled数据变量为保护成员,类型为BOOL.同样在构造函数中谁的些数据成员为TRUE。
.
现在当GoForward和GoBack的菜单UPDATE_COMMAND_UI被处理,你可以直接进行设置.下为示例代码:
DocumentComplete
当一个文档完整的完成下载InternetExplorer激发DocumentComplete事件.仅仅当此事件激发后文档对象才可安全使用.在一个无帧的Web页情形中文档对象是IHTMLDocument2对象,我们以后会讨论.当文档对象准备好可用,他的状态为READYSTATE_COMPLETE.
关于DocumentComplete事件以西击点需要注意:
∙ 在没有帧的web页,DocumentComplete事件在下载完成后激发一次.
∙在多帧的web页,此事件激发多次.并非每一个帧激发一个事件,但每一个帧激发DownloadBegin事件将会相应激发DocumentComplete事件.
∙DocumentComplete又一个指向IDispatch的指针参数,该参数指向激发此事件的窗口.此窗口可以是帧中的窗口
∙顶级帧在所有子帧激发了各自的DocumentComplete事件后激发自己的DocumentComplete事件。
因此,,要看一个web页是否完整下载完成,你需要从该事件的处理句柄中获取由事件产地过来的IDispatch参数的IUnknown接口。
下一步,比较IUnknown接口是否指向你正宿主的WebBrowser控件或者自动化的IE的实例的IUnknown接口.如果这两个指针相同,这意味着全部HTML,图片images,控件,以及诸如此类在顶级帧或者子帧的全部对象元素都被下载了.
VB中实现以上四点及其容易.仅需要检查发送给事件的pDisp参数事一个WebBrowser对象.VisualBasic小心检查这些对象的Iunknown否为同一个对象.此处为VB代码:
:
实现以上四点在VisualC++应用程序里较困难一点,但你可以做到!
首先在DocumentComplete事件的宏中如下声明:
ON_EVENT(CMfcWebHostView,IDC_WEBBROWSER,DISPID_DOCUMENTCOMPLETE,
OnDocumentComplete,VTS_DISPATCHVTS_PVARIANT)
接下来声明OnDocumentComplete方法作为事件处理句柄
voidOnDocumentComplete(LPDISPATCHlpDispatch,VARIANTFAR*URL);
最后,实现该方法以检测是否页面已经下载,我们得到我们宿主控制bBrowser控件的IUnknown.(注意我们不是简单获取指向IUnknown,而是要调用GetControlUnknown方法.GetControlUnknown方法返回的IUnknown指针实际上并不等于被宿主话的WebBrowser控件的IUnknown.那将返回IOleObject接口指针.)下一步,获取IUnknown指针,如果QueryInterface查询得到的Dispatch参数同Iunknown接口是同一对象,则页面完成整个下载。
.
voidCMfcWebHostView:
:
OnDocumentComplete(LPDISPATCHlpDispatch, VARIANTFAR*URL)
{
HRESULT hr;
LPUNKNOWNlpUnknown;
LPUNKNOWNlpUnknownWB=NULL;
LPUNKNOWNlpUnknownDC=NULL;
lpUnknown=m_webBrowser.GetControlUnknown();
ASSERT(lpUnknown);
if(lpUnknown)
{
//GetthepointertotheIUnknowninterfaceoftheWebBrowser
//controlbeinghosted.ThepointertotheIUnknownreturnedfrom
//GetControlUnknownisnotthepointertotheIUnknownofthe
//WebBrowsercontrol.It'sactuallyapointertotheIOleObject.
//
hr=lpUnknown->QueryInterface(IID_IUnknown,
(LPVOID*)&lpUnknownWB);
ASSERT(SUCCEEDED(hr));
if(FAILED(hr))
return;
//GetthepointertotheIUnknownoftheobjectthatfiredthis
//event.
//
hr=lpDispatch->QueryInterface(IID_IUnknown,
(LPVOID*)&lpUnknownDC);
ASSERT(SUCCEEDED(hr));
if(SUCCEEDED(hr)&&lpUnknownWB==lpUnknownDC)
{
//Thedocumenthasfinishedloading.
//
MessageBox("Thedocumenthasfinishedloading.");
}
if(lpUnknownWB)
lpUnknownWB->Release();
if(lpUnknownDC)
lpUnknownDC->Release();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IE 编程