如何对webbrowser和IE编程
推荐于2016-07-07 · 知道合伙人数码行家
知道合伙人数码行家
向TA提问 私信TA
如你所知, Internet Explorer像其他COM对象一样激发事件—通过连接点.但实际上Internet Explorer如何激发事件呢?每次 Internet Explorer需要向客户提供关于当前活动状态的信息,Internet Explorer 激发通过DWebBrowserEvents2 连接点激发一个事件. (之前到版本 4, Internet Explorer 通过 DWebBrowserEvents 接口激发事件.但到了版本4.x和5, Internet Explorer 通过 DWebBrowserEvents2 连接点.)
注意
如何领会到Internet Explorer加法那些事件?最佳途径是MSDN Online Web Workshop. 另外采用 OLE-COM Object Viewer不像WebBrowser 控件 和 Internet Explorer的其他接口,是剑接口没有继承体系. DWebBrowserEvents 接口严格应用于Internet Explorer 3. 如果你正宿主WebBrowser 控件或者自动化Internet Explorer 5, 你可以通过此接口接收事件—但是不可挂接. DWebBrowserEvents2 接口包含的方法是为Internet Explorer 5定制的.用 DWebBrowserEvents2 替代DWebBrowserEvents ,你将有更多的控制能力. 所以不要忘记接口的最后面的2.尽管DWebBrowserEvents2 是一个事件接口, 它其实就是像IWebBrowser2 一样的另外 COM 接口,所以它可以包含方法. (D 开头的命名是表示这是派遣接口.一个派遣接口是一个IDispatch 接口.但不同于普通接口, 派遣接口没有vtable.) 就像一个接口一样,派遣接口只不过提供一些函数的定义—他们并不真实实现.事件的实现由客户提供.举例来说,为了让WebBrowser 激发一个事件, 在DWebBrowserEvents2 接口中适当定义一些方法.这些方法由客户实现.但WebBrowser不直接调用这些方法.换句话讲, WebBrowser 并不调用DocumentComplete 方法.因为 DWebBrowserEvents2 是派遣接口, WebBrowser 通过IDispatch::Invoke调用客户的实现. 早期, 当WebBrowser 调用客户的Invoke 实现, WebBrowser 传递事件被激发的DISPID.
注意
某些工具如Visual Basic, MFC, 和 ATL 提供Invoke实现
表7-6 列出 WebBrowser 事件. (这些是WebBrowser 控件和Internet
Explorer供有的事件,尽管有些事件仅仅用于自动化Internet Explorer).
注意
尽管有些方法为不包含2.尽管DWebBrowserEvents2 并非继承自WebBrowserEvents, DWebBrowserEvents2
还是匹配 DWebBrowserEvents 中被更改的,以免混淆。
注意表 7-6 重的参数有些值同样有 VARIANT_ TRUE 或 VARIANT_FALSE. 如果你使用Visual C++,确信分派使用这些值不要使用 TRUE 或 FALSE. 如果你使用Visual Basic,
它会自动帮助你转换,你可以比较True和False.
现在来仔细看看这些事件
我们需要注意以上代码的几个重点.
首先你必须检查pDisp 的类型使之确定为WebBrowser. 当页面包含帧, pDisp 可能不是 WebBrowser 对象由此一些导航会导致错误.
其次你必须检查确信Headers 参数是空字符串以避免无限循环.记住BeforeNavigate2 每一次导航都会发生.因此如果你在BeforeNavigate2事件处理中调用Navigate, 另外一次 BeforeNavigate2 将被激活. 在前面的代码中, 仅仅在Headers 参数为空才调用Navigate 避免了无限循环. 如果Headers 参数是空, Navigate 将携带非空的 Headers 参数. 下一次BeforeNavigate2 北激活, Headers 将不为空; 此时,我们千万不可再次Navigate a,从而导致一个无限循环.
第三点你必须调用pDisp 的Stop 方法.如果你没做到这点,"about:NavigationCanceled" Web 页将会载你首次取消掉导航时被显示.
CommandStateChange
CommandStateChange 是当Internet Explorer 想通知一个应用程序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.
为说明问题,我们看看代码。一下代码为定义事件接收的宏声明:
if (!m_webBrowser.Create(NULL, WS_CHILD|WS_VISIBLE,
CRect(), this, IDC_WEBBROWSER))
{
return -1;
}
下一步声明OnCommandStateChange 方法,该方法将在WebBrowser控件激发CommandStateChange
事件时被调用.可声明 如下:
void OnCommandStateChange(long lCommand, BOOL bEnable);
在 OnCommandStateChange 方法的是现代码中, 设定表示Go Forward 或者 Go Back
想得导航菜单项的数据成员为使能或者禁止. 该书据成员将被UPDATE_COMMAND_UI 句柄使用。以下为OnCommandStateChange
方法实现:
void CMfcWebHostView::OnCommandStateChange(long lCommand, BOOL bEnable)
{
switch(lCommand)
{
// Forward command
//
case CSC_NAVIGATEFORWARD:
m_fForwardEnabled = bEnable;
break;
// Back command
//
case CSC_NAVIGATEBACK:
m_fBackEnabled = bEnable;
break;
default:
break;
}
}
声明m_fForwardEnabled 和 m_fBackEnabled
数据变量为保护成员,类型为BOOL.同样在构造函数中谁的些数据成员为TRUE。.
现在当Go Forward和Go Back的菜单 UPDATE_COMMAND_UI被处理, 你可以直接进行设置. 下为示例代码:
void CMfcWebHostView::OnUpdateNavigateGoForward(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_fForwardEnabled);
}
void CMfcWebHostView::OnUpdateNavigateGoBack(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_fBackEnabled);
}
DocumentComplete