通过Visual Studio 2005生成浏览器帮助程序对象

http://tech.ddvip.com   2008年01月22日    社区交流

内容摘要:本文说明如何使用Visual Studio 2005创建一个简单的“浏览器帮助程序对象”(BHO),即实现IObjectWithSite接口并将其自身附加到Internet Explorer的一种“组件对象模型”(COM)对象。本文逐步说明了如何创建入门级BHO。

void STDMETHODCALLTYPE CHelloWorldBHO::OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL)
{
// 从站点检索顶级窗口。
HWND hwnd;
HRESULT hr = m_spWebBrowser->get_HWND((LONG_PTR*)&hwnd);
if (SUCCEEDED(hr))
{
// 加载页面时输出消息框。
MessageBox(hwnd, L"大家好!", L"BHO", MB_OK);
}
}

  请注意,消息框会将站点的顶层窗口用作其父窗口,而不仅仅是通过该参数传递 NULL。在 Internet Explorer 6 中,NULL 父窗口并不阻止应用程序,也就是说,在消息框等待用户输入时用户可以继续与浏览器交互。在某些情况下,这会导致浏览器挂起或崩溃。在 BHO 需要显示 UI 的这种少见情况下,应始终通过指定指向父窗口的句柄来确保该对话框为应用程序模态。

  再一次试用

  通过按 F5 再次启动 Internet Explorer。文档加载后,BHO 将显示其消息。

通过Visual Studio 2005生成浏览器帮助程序对象

  图2

  继续浏览以观察消息框出现的时间及频率。请注意,不仅在加载页面时会显示 BHO 警告,在通过单击“上一步”按钮重新加载该页面时也会显示 BHO 警告;但在单击“刷新”按钮时不会显示该警告。在 Internet Explorer 7 中,对于每个新的选项卡都会显示该消息框。

  该事件在页面被下载和解析后激发,但是在 window.onload 事件触发之前激发。在有多个框架的情况下,该事件将激发多次,结束时后面跟随的是顶层框架。在随后的代码中,通过将事件的 pDisp 参数所传递的对象与在 SetSite 中进行缓存处理的顶层浏览器进行比较来检测出这一系列事件的最后事件。

来源:51CTO    作者:John Sudds    责编:豆豆技术应用

正在加载评论...