如何对webbrowser和smart1000ie编程软件

如何对webbrowser和IE编程_百度知道如何对webbrowser和IE编程
如何对webbrowser和IE编程
因为工作缘故,需要研究对IE编程,所以翻译了MS的有关资料,供参考。
WebBrowser Host
首先,必须有COM的基础知识,因为IE本身就是COM技术的典型应用。我们看到最上层是WebBrowser的宿主(Host),也就是任何你想重用(ReUse)webbrowser control的应用程序,可以是vb程序,也可以是vc或者任何其他语言的应用程序。应用程序必须是可容纳activex控件的容器。
Webbrowser control既是activex control也是activex document 的宿主。作为控件,它可以置于任何activex容器,作为文档容器,它针对特殊的类型,调用特殊类型注册的文档server以显示文档。如果你想显示一个.doc文档,webbrowser control装载windows word,,对于html文档,webbrowser装载名为mshtml的组件(如图所示)。针对不同的文档,你不需要开发不同的应用,仅仅是调用webbrowser control即可。
Shdocvw.dll包含了webbrowser control ,控制webbrowser control (就像控制其他任何activex com 控件一样),提供浏览能力给上层宿主。请注意webbrowser control位于第二级中。甚至IE也不直接而是通过shdocw.dll来使用webbrowser control的。尽管shdocvw提供了大部分的浏览功能,但是并不提供IE窗口的呈现功能。尽管如此,shdocvw还是提供了简单创建web 应用程序的能力。之后章节会讲到如何将ie的高级特性加入到你的应用程序。
早期的mshtml具有读取显示html的功能。MSHTML实际上是一个active 文档服务器,但是却可以作为其他控件的容器(如图中所示的)。记得吗,你可以将activex控件置于html中,此时mshtml就是一个activex宿主,还可以控制其他的控件如vbscript 脚本引擎和javascript脚本引擎,java applet ,geszhong,各种插件—别意外,plug-in都是按照ie activex规范写的。
WebBrowser Control 与 Internet Explorer
二者又太多的共同点,你都是通过COM接口来访问其功能。当调用webbrowser控件时,使用的是webbrowser对象,在vc中是使用class ID CLSID_WebBrowser的接口类。
当自动化ie时,必须建立名为 InternetExplorer的对象,vc等语言中使用名为class ID CLSID_InternetExplorer的接口类。
webbrowser有4个接口(如图),其中3个提供全部的功能,第4个DWebBrowserEvents2接口暴露事件
ie4 之前,仅有IwebBrowser和IwebBrowserApp两个接口,且二者共享相同的功能,当开发ie4时候,决定加入第三个接口IWebBrowser2扩展webbrowser的功能。该接口派生于第二个接口。
IWebBrowser
IWebBrowser 仅仅是WebBrowser control的最初接口, 提供基本的例如导航web页面的功能。 作为其他派生接口的基础接口,有8个方法和30个属性。
方法作者Blog:http://blog.csdn.net/shanhe/
如何对webbrowser和IE编程(二)
调用 Navigate 方法比GoBack 以及 GoForward& 要困难,但如果你正仅仅导航到URL 且并不传递任何附加参数, 它的调用很容易。 举例来说, VB中导航到 Microsoft 主页, 可如下:
WebBrowser1.Navigate ""
VB代码调用Navigate 如此容易因为所有参数出第一个参数外都可以是可选. 如此相对照,VC++不可以省略任何参数. 如果你想使用VC++不是勇任何特别的参数导航到 Microsoft的 home page, 你必须传递空的VARIANT 结构。 MFC 应用程序,你必须如下调用 Navigate
COleVariant vtEm_webBrowser.Navigate(_T(""), &vtEmpty, &vtEmpty,&&&&&&&&&&&&&&&& &vtEmpty, &vtEmpty);
该例子展示了在MFC应用程序中控制WebBrowser控件. 我传递一个普通的字符串而替代 BSTR 因为 MFC 提供了一个 WebBrowser 控件的包装类,第一个载包装类中是LPCTSTR, 一个普通的字符串. 其他参数为指向 VARIANT 结构的指针。 如果你不想指定任何特别的参数, 别仅仅传递 NULL —那样做, 你的应用程序会招来崩溃。你必须传递一个空的VARIANT 结构的指针. 前面的代码使用了 COleVariant 类, 那是一个与 CComVariant 类相似的类。 COleVariant 简单包装了 VARIANT 使得VARIANT 结构易于使用.
属性 现在你看到了所有的 IwebBrowser 的方法,你大概向了解其属性。(我是不是太苛求了?)& IWebBrowser 接口有30个属性,描述于表6-2. 我一已按照IWebBrowser& 的Vtable中的字母序列出。
Table 6-2. IWebBrowser 属性按照vtable排序
属性如何对webbrowser和IE编程(四) 收藏
新一篇:&如何对webbrowser和IE编程(五) &|&旧一篇:&如何对webbrowser和IE编程(三)
寄宿WebBrowser 控件
我们现在开始在VB和VC中创建一些程序来寄宿(Host)WebBrowser控件。在你完成本部分的样本,你将对如何创建寄宿一个WebBrowser控件的应用程序又一个基本的了解。当你看到如此容易的加入Web浏览功能加入到你的应用程序,我相信你会立即开始实践的。
在VB中,你可以在5分钟内开发一个全功能的自己的web浏览 。以下步骤为建立一个web浏览器程序:
1.&&& 启动VB.
2.&&&&&& 选择“Standard EXE“ ,进入设计模式。
3.&&&&&& WebBrowser 控件未自动化包含到控件工具箱(Control Toolbox)。 要增加 WebBrowser 控件到 控件工具箱,选择 Project 菜单下的Components. ,如下对话将显示:
Figure 6-3. 组件对话框.
4.&&&&&& 如果Controls TAB页未显示,点击 Controls TAB页 。然后勾选中列表中的“ Microsoft Internet Controls”,点击OK关闭对话框。Vb将会增加WebBrowser 控件到控件工具箱,如图所示:
Figure 6-4. Visual Basic 控件工具条在增加了WebBrowser 控件后的图标
5.&&&&&& 为增加 WebBrowser 控件至窗体,点击WebBrowser 控件,然后确定在窗体中的大小。一旦你增加了一个控件到表单,Visual Basic 将指派其名称为 WebBrowser1.
6.&&&&&& 调整表单的尺寸一边导航时候可看到更多的web内容。预留一些空间给地址栏。表单看起来如 Figure 6-5.
7.&&&&&& 双击空区域以增加Load 事件。为了能够使WebBrowser 导航到一个web页,你仅需要调用如 GoHome, GoSearch, Navigate, 或者 Navigate2.等导航方法。
8.&&&&&& 调用GoHome 方法到用户主页。代码如下:
Private Sub Form_Load()&& WebBrowser1.GoHomeEnd Sub
Figure 6-5. Visual Basic form after adding the WebBrowser control.
如此就完成了! 你已经创建了一个全功能的web浏览器. 照我的时间,仅仅不好过分钟。为确信它可工作,你可启动进行测试。你的应用程序将装入webbrowser控件兵导航到主页。保存工程为VbWebHost.
尽管你已经拥有一个可工作的Internet应用程序,你仍需要做些工作视你的应用程序更像一个真实的web浏览器。为了可导航增加一些控件到表单。为输入URL增加一个 label, 一个文字输入框, Go 按钮,& Back 按钮,& Forward 按钮, 以及Stop 按钮. 表单应该看起来如Figure 6-6.
如 Table 6-7 分派给你的控件属性。
Figure 6-6. Visual Basic form after adding controls.
Table 6-7. 控件属性
控件如何对webbrowser和IE编程(五) 收藏
新一篇:&如何对webbrowser和IE编程(六)&|&旧一篇:&如何对webbrowser和IE编程(四)
自动化 Internet Explorer
自动化打开了开发基于web应用的世界。 它允许你使用VB或者VC定制成熟的应用。自动化的好处:通过属性和方法可以改变IE的外观;你可以提供诸如导航条等用户接口以便控制用户的导航。
自动化IE很容易。你建立一个简单的应用启动一个IE实例,然后使用控制webbrowser的途径- IWebBrowser2 接口来控制IE实例。
术语自动化(automation)真实的含义是通过自动化接口-- IDispatch.控制一个COM对象。但是在此是指控制IE的技术,你不需要直接通过IDispatch
前面已经介绍了如何五分钟在VB中使用webbrowser来创建全功能的浏览器应用. 你也可以大致使用此时间用VB自动化IE。让我们开始。
启动一个Standard EXE 工程,选择References 菜单项. 引用对话框展开如Figure 6-19:
Figure 6-19. References dialog box.
滚动下拉,选中 Microsoft Internet Controls 检查框,点击OK 。加入一个命令按钮到窗体,命名为btnStart, 修改标题为 Start IE5. 然后双击加入click事件代码。
当用户点击Start IE5 按钮, 你想应用程序启动一个Internet Explorer 5实例. 先建立一个类型为 InternetExplorer 的全局变量. 命名为InternetExplorer1.
现在, 在btnStart的Click 事件中, 加入如果上一个实例没有创建就创建新IE实例的代码。你可以使用CreateObject 或者Vb的New 关键字.如下:
Set InternetExplorer1 = New InternetExplorer
该代码创建一个新实例,但是实例是隐藏的,要显示该实例,设定Visible 属性为 True, 如下:
InternetExplorer1.Visible = True
现在你需要导航到某个web页,你可以如下调用InternetExplorer 对象的Navigate方法, 如下:
InternetExplorer1.Navigate "/"
至此,整个Vb的自动化IE的源代码看起来如下:
Option ExplicitDim InternetExplorer1 As InternetExplorer&Private Sub btnStart_Click()&& ' Only create a new instance of Internet Explorer&& ' if one hasn't already been created.&& '&& If Not InternetExplorer1 Is Nothing Then&&&&& Exit Sub&& End If&&& Set InternetExplorer1 = New InternetExplorer&& &&&' Make Internet Explorer visible and navigate&& ' to Microsoft's home page.&& '&& InternetExplorer1.Visible = True&& InternetExplorer1.Navigate "/"End Sub&Private Sub Form_Load()&& Set InternetExplorer1 = NothingEnd Sub
运行应用程序看到IE启动了! 新的IE实例将被启动导航到MS的主页。者不太困难,是不是?现在让我们加入一些实在的较酷的特征允许你控制你自己创建的IE实例。
首先保存工程为 VbAutoIE.vbp, 且保存你的表单 VbAutoIE.frm. 然后加入一些控制到你的表单,如图Figure 6-20. 这些允许你显示或者隐藏IE中不同的用户接口特征如地址栏、菜单条、状态条和工具条等。你也可以加入文字到状态条。
Figure 6-20. Visual Basic form with controls to customize the Internet Explorer user interface.
现在如下表设定每一个控件的属性如表6-8.创建4个选项组,每一个包含 一个显示和一个隐藏选项按钮如Figure 6-20.
Table 6-8. Control Properties for a Visual Basic Program Automating Internet Explorer
Control如何对webbrowser和IE编程(六)收藏
新一篇:&如何对webbrowser和IE编程(七)&|&旧一篇:&如何对webbrowser和IE编程(五)
使用VC++和COM API
尽管使用VC不像Vb中那么容易自动化IE,但是也不太难,尤其是你理解了CON和COM API。无论你使用MFC, ATL, 或者标准 C++自动化IE,方法都是一样—你使用COM API来实现.
VC++中创建一个Internet Explorer实例包括要调用COM API CoCreateInstance ,指定第一个参数为 CLSID_InternetExplorer 。创建IE自动化实例不像创建包含webbrowser的Activex控件困难。你不需要实现容器或者site对象的必要接口。
来看看如何容易的使用CoCreateInstance 创建IE实例吧。启动Visual C++, 新建MFC AppWizard (exe) 应用程序命名为 MfcAutoIE.选择dialog-based option, 认可其他缺省选项.
现在加入如VbAutoIE中的控件到表单.对话框看起来如 6-21. 分派ID到对话框的各个控件。 确信控件TAB次序如 Figure 6-22. (tab 次序影响到radio按钮的工作)
Figure 6-21. MfcAutoIE dialog.
Figure 6-22. MfcAutoIE dialog tab order.
现在用右键菜单设置每一个隐藏radio按钮的Group ,属性设置如表 6-9.
Table 6-9. Member Variables for MfcAutoIE Dialog Controls
Control日 00:22:00|评论(<SPAN id=FeedbackCount_
新一篇:&如何对webbrowser和IE编程(七)&|&旧一篇:&如何对webbrowser和IE编程(五)
#windcbf&发表于 21:10:00&&IP: 61.186.252.*
netscape 的核心是 mozilla,所以看看怎么对mozilla进行编程。 区别在于,IE是用COM,Mozilla是用XPCOM
#xiao_q654321&发表于 17:20:19&&IP: 218.108.199.*
您好,我是这样做的:CWnd m_wndB////IWebBrowser2 的容器IWebBrowser2 *m_pBm_wndBrowser.CreateControl(CLSID_WebBrowser, NULL, WS_VISIBLE | WS_CHILD, rectClient, this, AFX_IDW_PANE_FIRST);LPUNKNOWN lpUnk = m_wndBrowser.GetControlUnknown();HRESULT hr = lpUnk-&QueryInterface(IID_IWebBrowser2, (void) &m_pBrowser);可以显示网页,但奇怪的是网页的按键事件无法激活,请教存在什么问题?网页的js:document.onkeydown=keyDfunction keyDown(){ var keycode = event.keyC alert keyC}
如何对webbrowser和IE编程(七)收藏
新一篇:&关于Cookie&|&旧一篇:&如何对webbrowser和IE编程(六)
加入高级功能
本节将展示如何加入高级功能到你的应用程序或者ActiveX控件.将展示如何从一个ActiveX控件中访问Internet Explorer的 IWebBrowser2,以及如何从一个Web页面的frame中获得WebBrowser 对象。将会展示实现一些并非容易实现的功能.本节有一定难度.所有代码采用C++ 和COM实现,你应当有一定坚实的基础才可以完成本节的理解
从ActiveX 控件中访问Internet Explorer 的IWebBrowser2
在Activx控件中访问IWebBrowser2 接口提供了用户定制浏览器的能力,虽然以此作为自己的控件功能不大光明,且你只能够在VC编写的activeX控件中访问。(尽管可以在VB写的控件中访问document和window控件,但是你不可以直接访问WebBrowser 自身) .
存取& IWebBrowser2 接口经过四个步骤:
1.&&& 在类文件中包含 ExDisp.h .
2.&&&&&& 调用控件的站点的IOleClientSite::GetContainer 方法,该方法返回由Internet Explorer.实现的 IOleContainer 接口的指针。
3.&&&&&& 如果步骤2成功,用 IOleContainer 指针查询IServiceProvider 接口。.
4.&&&&&& 如果步骤3 成功, 调用IServiceProvider 的方法QueryService 的到 IWebBrowser2 接口。
QueryService 方法携带3个参数. 第一个参数指定你想访问的服务。为得到IWebBrowser2 指针, 需要指定SID_SInternetExplorer 或者SID_SWebBrowserApp 来指定要访问的服务. (现阶段,他们全部定义为IID_IWebBrowserApp.) 第二个参数指定你想接收的接口的ID。此参数你应当指定为IID_IWebBrowser2. 最后,第三个参数你需要指定哪一个变量接收返回的接口指针。
Call any method or property of IWebBrowser2. 当完成后,确信你已经释放掉你获取的接口指针.以下为代码参数.
////////////////////////////////////////////////////////// Begin Step 1&#include &ExDisp.h&#include &shlguid.h&&// End Step 1////////////////////////////////////////////////////////&CSomeClass::SomeMethod(){&////////////////////////////////////////////////////////// Begin Step 2&IOleContainer* pC&// m_pClientSite is a pointer to IOleClientSite.// This is the client site for your control.//HRESULT hr = m_pClientSite-&GetContainer(&pContainer);if (FAILED(hr))&& &// End Step 2////////////////////////////////////////////////////////&////////////////////////////////////////////////////////// Begin Step 3&IServiceProvider* pServiceP&hr = pContainer-&QueryInterface(IID_IServiceProvider,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (void)&pServiceProvider);pContainer-&Release();&if (FAILED(hr))&& &// End Step 3////////////////////////////////////////////////////////&&////////////////////////////////////////////////////////// Begin Step 4&IWebBrowser2* pWebB&hr = pServiceProvider-&QueryService(SID_SWebBrowserApp,&&&&&&&&&&&&&&&&&&&&&&&&&& IID_IWebBrowser2,&&&&&&&&&&&&&&&&&&&&&&&&&& (void)&pWebBrowser);pServiceProvider-&Release();&if (FAILED(hr))&& &// End Step 4////////////////////////////////////////////////////////&&////////////////////////////////////////////////////////// Begin Step 5&// Call some IWebBrowser2 methods and/or properties.&// End Step 5////////////////////////////////////////////////////////}
利用一个控件打印web页
早于5的Internet Explorer,通常用于ActiveX中 访问IWebBrowser2 接口以提供打印web页面的功能。尽管ie5允许你直接在web页的script中使用 window.print, 但是建立一个提供打印web页的功能的示范还是比较好教您使用IWebBrowser2接口的入门教程.在此之前,必要知道如何使用ATL建立一个activeX控件以实现打印功能. 关于此点,我将认为您已经知道如何使用ATL创建一个控件.
启动Visual C++, 新建 ATL DLL工程. 你可将工程命名为 AtlPrint. 下一步, 使用Wizard增加一个Lite Control 到你的工程。 你可以命名你的控件为PrintCtl. 为IPrintCtl 接口添加一个方法Print. 之后你将在脚本中使用此方法打印当前Web page.
在实现Print 方法前,首先包含ExDisp.h 和 shlguid.h 头文件到PrintCtl.cpp 实现文件.
下一步使用之前给出的获取IWebBrowser2 接口的方法获得接口并调用ExecWB 以实现打印当前Web页. 你可以使用ATL 智能接口指针类—CComPtr 以及 CComQIPtr—以实现查询接口处理引用次数等艰苦的工作.此处为智能指针示勇代码:
STDMETHODIMP CPrintCtl::Print(){&& HRESULT hr = E_FAIL;&&& if (m_spClientSite)&& {&&&&& CComPtr&IOleContainer& spC&& &&&&&&hr = m_spClientSite-&GetContainer(&spContainer);&&&&& ATLASSERT(SUCCEEDED(hr));&&&&&& if (SUCCEEDED(hr))&&&&& {&&&&&&&& CComQIPtr&IServiceProvider, &IID_IServiceProvider&&&&&&&&&&&& spServiceProvider(spContainer);&&&&&&&&& ATLASSERT(spServiceProvider);&&&&&&&&& if (!spServiceProvider)&&&&&&&&&& &hr = E_FAIL;&&&&&&&& else&&&&&&&& {&&&&&&&&&&& CComPtr&IWebBrowser2& spWebB&&&&&&&&&&&& hr = spServiceProvider-&QueryService(SID_SInternetExplorer,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& IID_IWebBrowser2,&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&(void)&spWebBrowser);&&&&&&&&&&& ATLASSERT(SUCCEEDED(hr));&&&&&&&&&&&& if (SUCCEEDED(hr))&&&&&&&&&&& {&&&&&&&& &&&&&&&&&&&&&&&spWebBrowser-&ExecWB(OLECMDID_PRINT, &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&OLECMDEXECOPT_PROMPTUSER,&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&NULL, NULL);&&&&&&&&&&& }&&&&&&&& }&&&&& }&& }&&& }
现在编译ATL ActiveX control. 为测试打印功能,你必须加入一些script. Listing 6-2 展示了这部分代码:
Listing 6-2.
PrintCtl.htm&HTML&&HEAD&&& &TITLE&ATL 3.0 test page for object PrintCtl&/TITLE&&&& &SCRIPT LANGUAGE="VBS"&&&&&& Sub btnPrint_onclick&&&&&&&& PrintCtl.Print&&&&& End Sub&& &/SCRIPT&&/HEAD&&BODY&&& &OBJECT &&&&& CLASS&&& &/OBJECT&&& &P&&& &BUTTON &Print Page&/BUTTON&&/BODY&&/HTML&
当宿主WebBrowser控件的时候存取帧的IWebBrowser2 接口
如果一个Web 页包含了多帧,每一帧都包含了一个WebBrowser 对象。 当宿主WebBrowser 控件, 你将可被允许从应用程序访问WebBrowser 以控制帧.此控允许你控制以在帧中导航, 刷新, 以及诸如此类。一旦你拥有了一个帧中的 WebBrowser 对象的IWebrowser2 接口指针, 你可以掉用IWebrowser2 接口的任何方法和属性。
在VC++中你可以访问一个帧中的WebBrowser. VB中,你可在帧中存取document , 你可以访问WebBrowser 但是不可以访问装载于WebBrowser窗口中的HTML文档对象的 IoleContainer 接口. 存取 IOleContainer 要求访问帧的 WebBrowser 对象. 本节讲述VC++d的标准技术细节,即WebBrowser 控件的宿主能访问在包含的WebBrowser控件装载的web页面的帧窗口的WebBrowser对象模型.
下面的代码展示如何访问web页面的每一个帧的WebBrowser对象以刷新每一帧的内容.其中重要的片断用于用HTML document 对象的IOleContainer::EnumObjects& 方法枚举页面中的embeddings(嵌入)对象. 每一个嵌入对象表现为一个控件. 利用IWebBrowser2 接口查询每一个控件对象,此代码可检测到控件是否是一个子帧.如果为获得 IWebBrowser2 而成功调用QueryInterface, 其结果为帧中的WebBrowser对象的引用. (数据成员m_webBrowser 是CWebBrowser2 类型的—MFC 包装类)
// Get the IDispatch of the document.//LPDISPATCH lpDisp = NULL;lpDisp = m_webBrowser.GetDocument();&if (lpDisp){&& IOleContainer* pC&&& // Get the container.&& //&& HRESULT hr = lpDisp-&QueryInterface(IID_IOleContainer,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (void)&pContainer);&& lpDisp-&Release();&&& if (FAILED(hr))&&&&& &&& // Get an enumerator for the frames.&& //&& IEnumUnknown* pE&&& hr = pContainer-&EnumObjects(OLECONTF_EMBEDDINGS, &pEnumerator);&& pContainer-&Release();&&& if (FAILED(hr))&&&&& &&& IUnknown* pU&& ULONG uF&&& // Enumerate and refresh all the frames.&& //&& for (UINT i = 0; S_OK == pEnumerator-&Next(1, &pUnk, &uFetched); i++)&& {&&&&& // QI for IWebBrowser here to see whether we have &&&&&&// an embedded browser.&&&&& IWebBrowser2* pWebB&&&&&& hr = pUnk-&QueryInterface(IID_IWebBrowser2, (void)&pWebBrowser);&&&&& pUnk-&Release();&&&&&& if (SUCCEEDED(hr))&&&&& {&&&&&&&& // Refresh the frame.&&&&&&&& pWebBrowser-&Refresh();&&&&&&&& pWebBrowser-&Release();&&&&& }& &}&&& pEnumerator-&Release();}
请留意在代码中我们首先通过GetDocument 方法获得了文档的IDispatch 对象指针, 该方法是WebBrowser 包装类的成员指针.然后我们访问文档的IOleContainer 接口. IOleContainer 接口提供了能够枚举页面中全部嵌入对象的功能. 然后我们通过调用IOleContainer 的EnumObjects 方法得到枚举器(EnumObjects). EnumObjects 返回的 IEnumUnknown 接口的指针可以用于枚举全部嵌入(embeddings)对象. 代码的下一步, 我们遍历全部嵌入对象,查询每一个对象的IWebBrowser2 接口. 如果查询成功, 我们已经获得了帧的IWebBrowser2 接口指针.我们可以调用它的任何方法和属性,在此例中,我们仅仅调用了每一个帧的Refresh.
ActiveX 控件宿主于一个html页也有类似情。也许,如果你建立一个访问ie的 WebBrowser 控件或者页面帧中的WebBrowser 的控件,不要将你的控件标记为脚本安全和初始化安全。.
调用 查找, 察看源码, 以及 Internet 选项
浏览WebBrowser 控件的方法和属性, 你可轻易见到控件提供的功能.但是3个可编程由WebBrowser控件提供的项目不容易发觉到:查找对话框, 察看源代码菜单项,以及Internet选项对话框. 如果你曾经用过ie,你无疑很熟悉他们. 查找对话框, 允许你在WEB页中查找文本,通过处理 Ctrl-F 或者选择edit菜单的Find项来调用.
察看源代码菜单项,允许你显示WEB页的html代码, 可通过选择View菜单的Source项来选择或者右击web页(在弹处菜单中)选择察看源代码. Internet 选项对话框如图6-23所示, 可通过选择Tools菜单的Internet Option项来调用.
Figure 6-23. Internet Options dialog box.
能够在你的web应用中提供以上功能的确可以带来对用户的友善性,但是调用途径缺不是通过WebBrowser的方法和属性可以实现. 实际上你应当从调用IOleCommandTarget 的Exec 方法来调用实现于WebBrowser中的以上功能.当调用Exec, 你传递名为 CGID_IWebBrowser 的GUID 作为你想调用的命令的ID.尽管ExecWB 方法是IOleCommandTarget::Exec 方法的包装, 但是你不能够通过ExecWB 来调用 Find, View Source, 或者 Internet Options 对话框,以为ExecWB 不允许你指定命令组GUID. 那意味着该项技术仅能够用于VC++—你不能够直接从VB中调用。.
本代简要展示你未收入文档的命令组GUID ,那意味着可以将来改编。尽管代码已经在Internet Explorer 3.x, 4.x, 和 5中测试,,但是不保证在将来的版本中成功运行
以下步骤实现 Find, View Source, 以及Internet Options 命令:
1.&&& 定义WebBrowser 控件的命令组GUID:
DEFINE_GUID(CGID_IWebBrowser,0xEDxBD5B,0x11cf,0xBA,&&&&&&&& 0x4E,0x00,0xC0,0x4F,0xD7,0x08,0x16);
2.&&&&&& 定义用于Find, View Source, 和 Internet Options的ID:
&&&& &&&&&#define HTMLID_FIND 1&&&& #define HTMLID_VIEWSOURCE 2&&&& #define HTMLID_OPTIONS 3
3.&&&&&& 在需要的时候执行Find, View Source, 和Internet Options 命令. 举例来说,你可创建工具方法接收命令ID并调用 IOleCommandTarget::Exec, 如下片断所示. (注意在MFC代码中,m_webBrowser 是 WebBrowser 控件的实例. 同样, nCmdID 是定义的ID)
HRESULT CYourView::ExecCmdTarget(DWORD nCmdID){&& LPDISPATCH lpDispatch = NULL;&& LPOLECOMMANDTARGET lpOleCommandTarget = NULL;&& HRESULT hr = E_FAIL;&&& // Get the IDispatch of the document.&& //&& lpDispatch = m_webBrowser.GetDocument();&& ASSERT(lpDispatch);&&& if (lpDispatch)&& {&&&&& // Get a pointer for the IOleCommandTarget interface.&&&&& //&&&&& hr = lpDispatch-&QueryInterface(IID_IOleCommandTarget,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (void)&lpOleCommandTarget);&&&&& lpDispatch-&Release();&&&&&& ASSERT(lpOleCommandTarget);&&&&&& if (SUCCEEDED(hr))&&&&& {&&&&&&&& // Invoke the given command id &&&&&&&&&// for the WebBrowser control.&&&&&&&& hr = lpOleCommandTarget-&Exec&&&&&&&&&&&&& (pguidCmdGroup, nCmdID, 0, NULL, NULL);&&&&&&&& lpOleCommandTarget-&Release();&&&&& }&& }&&& }
分发WebBrowser 控件
现在你知道了如何利用WebBrowser 控件和IE创建专用应用程序, 你大概感兴趣知道那些IE组件你需要打包在你的应用程序以便你的应用程序可以在系统商正常工作即使没有IE5被安装.无论你宿主 WebBrowser 控件还是自动化Internet Explorer, 你必须至少打包IE最小化安装的组件. 为理解为什么,请再一次察看图6-1展示的体系.你可以看到每一个组件是如何的依赖其他组件—而且这幅图仅仅展示了其表面.它未能展示 webbrowser控件和IE多样特性的组件间的全部特征.因为由如此众多的组件调用,为了你的应用程序能够正常工作,你应当确信至少IE最小化安装于用户的操作系统.
别担心,你不需要打包每一个IE的组件.& Internet Explorer 5 安装程序允许你定制你的安装以使你打包你仅需的组件.另外, 如果你使用Internet Explorer Administration Kit (可在 /找到) 建立你的安装程序, 你可以将IE默认安装,免掉多个确认安装步骤的对话框.
如何对webbrowser和IE编程(八)收藏
新一篇:&如何对webbrowser和IE编程(九) &|&旧一篇:&关于Cookie
Internet Explorer 事件
IWebBrowser2 的属性和方法给了你确切的控制导航和用户接口的途径,但是如果你不能够检测到浏览器正在处理什么以及何时处理什么,你还是没有全面的控制它. 因此,WebBrowser控件和Internet Explorer暴露出事件,通过此你可以必要时监视活动以及处理某些活动. 举例来说,假设你建立一个intranet应用程序, 你想限制用户用户访问某些web页.利用Internet Explorer的时间处理句柄,你可以指令应用程序在用户试图访问受限的URL时候取消导航完成。
事件 和 引出的接口
无论何时一个COM 对象需要客户应用程序一个事件发生了, COM 对象发送一个叫做事件的消息. 发送消息的处理过程会激发一个事件. 但如果事件没有任何监听者会如何? 事件每次都发生吗? 显然, 客户应用程序监听这些事件并控制COM对象.如果一个客户应用想接收来自COM 对象的事件,它"advises" 实际的COM 对象的.
一个COM 对象为了通客户通信, 对象自身必须支持一个或者多个外引接口.一个 COM 对象支持的外引接口是作为可连接对象引用. 要成为一个可连接对象,COM对象必须实现IConnectionPointContainer 接口。通过此接口,客户可认识到那些外引接口被服务器支持. 外引接口实际通过连接点由客户挂接入COM实现。实现外引接口的客户部分众所周知是通过事件接收槽(event sink)实现的.
单一的连接点由服务器支持每一个外引接口.每一个连接点能够操纵一种类型的外引接口且至少支持IConnectionPoint 接口. 图7-1 描述了可连接的对象和它的客户之间的关系.
Figure 7-1. Connectable object and its client.
每一个服务器必须实现2个接口以便实现客户可以接收事件—IConnectionPointContainer 和 IConnectionPoint. 我们将先看看这些接口之后将检视实现事件的不同途径.
IConnectionPointContainer
每一个可连接对象实现了IConnectionPointContainer. 通过此接口, 试图接收事件的客户可找出关于可连接对象支持的不同的连接点. 通过调用QueryInterface using 客户可以获得服务器支持的任何接口的指针. (你可以使用任何接口指针调用QueryInterface, 因为全部 COM 接口继承自IUnknown.) 之后客户可以使用IConnectionPointContainer 接口的2个方法中的之一获取可连接点。 如表7-1, 获得可连接点
Table 7-1 Methods of the IConnectionPointContainer Interface
方法日 16:28:00|评论(<SPAN id=FeedbackCount_
新一篇:&如何对webbrowser和IE编程(九) &|&旧一篇:&关于Cookie
如何对webbrowser和IE编程(九) 收藏
新一篇:&关于WEB2.0的思考&|&旧一篇:&如何对webbrowser和IE编程(八)
接收事件的途径
依靠开发工具你创建客户应用程序,你可以接收事件通过不同的途径. 显然, 在Vb中接收事件同在VC中接收事件相比是如此不同和容易.在 C++ 应用中,你可以用不同的技术,通过使用 ATL, MFC, 或者标准C++.
Visual Basic 中接收事件
Visual Basic是创建大多数类型应用的最轻松的工具, 所以我告诉你VB是处理事件最溶的工具时也不要惊奇. ATL 和 Visual Basic 示例我们同样的工作,但是ATL花费了我4个小时, 而 Visual Basic 例子仅仅只花20 分钟.别说我错了—我是ATL, 和 MFC, C++的忠实信徒,& 尤其是你建立一个接口的时候.但是 Visual Basic当建立客户应用程序从类似IE这样的服务器接收事件时是伟大的工具.
OK, 如何从Visual Basic 应用程序中接收事件?当宿主WebBrowser 控件,你不必做任何特别的事. Visual Basic 在form上为WebBrowser 控件接收事件.你所需要做的全部事情就是未你要接收的任何事件创建一个事件处理句柄.
你象创建其他事件句柄一样创建句柄 (例如Form_Load event). 从Procedure下拉列表框中选择你象控制的句柄, 在事件句柄中,加入任何你型在事件激发时执行的任何代码.
当自动化服务器时候接收事件, 例如在VB应用中的Internet Explorer,过程直截了当.首先设置对服务器的类型库的引用, 你可以访问Project/References 菜单.之后,采用WithEvents 关键字声明服务器对象的变量.举例, 如果你自动化Internet Explorer, 你将声明变量如下:
Dim WithEvents InternetExplorer1 As InternetExplorer
下一步,采用new或者其他 关键字创建实例变量 ,如下::
Set InternetExplorer1 = CreateObject("InternetExplorer.Application.1")
Set InternetExplorer1 = New InternetExplorer
当你采用以上途径生成实例接收事件, Visual Basic 自动为你初始化和管理事件接收.你不必担心连接点问题,VB为你处理它们.
在你输入建立服务器的代码之后,你插入符合服务器事件的方法调用. &&举例来说, 如果你想控制由IE激活的DownloadBegin event, 你应当声明类似如下的方法声明:
Private Sub InternetExplorer1_DownloadBegin()&& ' Insert your best Visual Basic code here.End Sub
当你不再想接收来自服务器的事件,简单设置变量为Nothing:
Set InternetExplorer1 = Nothing
C++中接收事件
C++ 应用程序中接收事件比Vb中多一些工作.但如果你在MFC对话框程序中宿主过WebBrowser控件, 你可以在classwizard中选择你想控制的事件.使用C++的其他应用程序宿主WebBrowser 或者自动化Internet Explorer 需要多一点的工作,但是仍然不需要更多的工作.在C++客户接收事件,仅仅需要以下5个步骤:
1.&&& 获取连接点容器的指针 (IConnectionPointContainer).
2.&&&&&& 调用IconnectionPointContainer 的方法 FindConnectionPoint 找出你想接收的事件。对 Internet Explorer来讲, 你应当为DWebBrowserEvents2 连接点接口实现事件. (作为可选, 你可以调用 EnumConnectionPoints 以枚举服务器支持的全部连接点)
3.&&&&&& 实现接入你想接收事件的连接点的通报(Advise)。 当实现通告时,传递一个事件接收槽的Iunknown接口的指针。 记住,事件接收槽必须实现 IDispatch 接口以接收来自WebBrowser的事件。 Advise 方法将返回一个cookie ,该Cookie在你调用Unadvise 方法的时候携带上。
4.&&&&&& 实现 IDispatch::Invoke 以控制任何激发的事件。. (开发工具如 MFC 及 ATL 能够容易为你做到.)
5.&&&&&& 当你不再接受事件,调用Unadvise, 并且传递cookie.
以上步骤如果采用VB和MFC /ATL等可能不很明显,但是当你采用标准C++创建应用程序的时候就应当很明显了.
以下 C++ 代码允许你在自动化IE的时候接收事件. 留意注释代码实现了哪一个步骤. 假定当你想连接事件时ConnectEvents 方法被调用,且当应用程序退出时候Exit 方法被调用. 同样的,类 CSomeClass 继承自IDispatch, 且m_pIE 数据成员为通过CoCreateInstance 方法创建的IE的实例
void CSomeClass::ConnectEvents(){&& IConnectionPointContainer* pCPC&&& // Step 1: 获取连接点的指针.&& //&& HRESULT hr = m_pIE-&QueryInterface(IID_IConnectionPointContainer, &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&(void)&pCPContainer);&& if (SUCCEEDED(hr))&& {& &&&&// m_pConnectionPoint is defined like this:&&&&& // IConnectionPoint* m_pConnectionP&&&&&& // Step 2: 选找连接点.&&&&& //&&&&& hr = pCPContainer-&FindConnectionPoint(DIID_DWebBrowserEvents2, &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&m_pConnectionPoint);&&&&&& if (SUCCEEDED(hr))&&&&& {&&&&&&&& // Step 3: 实现连接点地事件接收&&&&&&&& //&&&&&&&& hr = m_pConnectionPoint-&Advise(this, &m_dwCookie);&&&&&&&& if (FAILED(hr))&&&&&&&& {&&&&&&&&&&& ::MessageBox(NULL, "Failed to Advise",&&&&&&&&&&&&&&&&&&& &&&&&"C++ Event Sink", MB_OK);&&&&&&&& }&&&&& }&&&&&& pCPContainer-&Release();&& }}&void CSomeClass::Exit(){&& // Step 5: Unadvise. 注意m_pConnectionPoint 应当在CSomeClass的析构函数中释放&& //&& if (m_pConnectionPoint)&& {&&&&& HRESULT hr = m_pConnectionPoint-&Unadvise(m_dwCookie);&&&&& if (FAILED(hr))&&&&& {&&&&&&&& ::MessageBox(NULL, "Failed to Unadvise",&&&&&&&&&&&&&&&&&&&&& "C++ Event Sink", MB_OK);&&&&& }&& }}
注意此处少了step4:客户端的 IDispatch::Invoke 方法实现. 我将很快讨论此点. 每一次服务器激发事件会调用此. 当事件被激发,服务器传递事件的DISPID 到Invoke. 对于 Internet Explorer 5, 以下DISPIDs 定义于ExDispID.h 头文件.
日 08:56:00|评论(<SPAN id=FeedbackCount_
新一篇:&关于WEB2.0的思考&|&旧一篇:&如何对webbrowser和IE编程(八)
#windcbf&发表于 21:17:00&&IP: 61.186.252.*
为什么没有看到 如何对webbrowser和IE编程(一) 和 如何对webbrowser和IE编程(二) ? 是不是贴在其他地方了?
#TNT&发表于 23:01:00&&IP: 61.186.252.*
在http://blog.csdn.net/shanhe/archive//397373.aspx http://blog.csdn.net/shanhe/archive//398041.aspx
#wisent&发表于 19:51:00&&IP: 61.186.252.*
您好, 我看了您的“如何对webbrowser和IE编程”的文章,对我很有用,谢谢。我现在是在一个对话框里面加了一个webbrowser控件进行浏览网页,但是点击了一个链接以后,会打开一个IE的窗口,我只想在webbrowser控件里面浏览网页,请问怎样才能解决这个问题,麻烦您指点一下,非常感谢!
#xiang&发表于 10:46:00&&IP: 211.100.4.*
您好: 请问有没有完整的程序例子可以参考?谢谢!!
#lovemylove&发表于 14:25:00&&IP: 219.144.166.*
拜读了你的关于IE编程的大作,十分钦佩,我现在正在用BHO开发一个客户端的网页修改程序,我已经实现了网页图片的替换,在对FLASH替换的时候发现替换不了,请问有什么办法能替换掉FLASH?如能指教,不胜感激!
如何对webbrowser和IE编程(十)收藏
新一篇:&一个哑巴(雅巴)的诞生!&|&旧一篇:&说说百度和百度的股疯
由Internet Explorer 5激发事件
如你所知, 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.
现在来仔细看看这些事件
Table 7-6 WebBrowser 事件
Figure 7-5. The sequence of events fired by the WebBrowser control during a typical navigation.
发表于 @ 日 22:28:00|评论(<SPAN id=FeedbackCount_
新一篇:&一个哑巴(雅巴)的诞生!&|&旧一篇:&说说百度和百度的股疯
> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!
寄宿WebBrowser 控件我们现在开始在VB和VC中创建一些程序来寄宿(Host)WebBrowser控件.在你完成本部分的样本,你将对如何创建寄宿一个WebBrowser控件的应用程序又一个基本的了解.当你看到如此容易的加入Web浏览功能加入到你的应用程序,我相信你会立即开始实践的.使用VB在VB中,你可以在5分钟内开发一个全功能的自己的web浏览 . ...
加入高级功能本节将展示如何加入高级功能到你的应用程序或者ActiveX控件.将展示如何从一个ActiveX控件中访问Internet Explorer的 IWebBrowser2,以及如何从一个Web页面的frame中获得WebBrowser 对象.将会展示实现一些并非容易实现的功能.本节有一定难度.所有代码采用C++ 和COM实现,你应当有一定坚实的基础才 ...
由Internet Explorer 5激发事件如你所知, Internet Explorer像其他COM对象一样激发事件—通过连接点.但实际上Internet Explorer如何激发事件呢?每次 Internet Explorer需要向客户提供关于当前活动状态的信息, Internet Explorer 激发通过DWebBrowserEvents2 连接 ...
IWebBrowserAppIWebBrowserApp 接口仅仅在IE中实现. 典型的,你使用InternetExplorer 对象创建一个IE的实例. 然后你使用 IWebBrowserApp 接口操纵此实例. (今天采用IWebBrowser2 替代) IWebBrowserApp 接口继承自 IWebBrowser, 所以它提供 IWebBrowse ...
接收事件的途径依靠开发工具你创建客户应用程序,你可以接收事件通过不同的途径. 显然, 在Vb中接收事件同在VC中接收事件相比是如此不同和容易.在 C++ 应用中,你可以用不同的技术,通过使用 ATL, MFC, 或者标准C++.Visual Basic 中接收事件 Visual Basic是创建大多数类型应用的最轻松的工具, 所以我告诉你VB是处理事件最溶的 ...
调用 Navigate 方法比GoBack 以及 GoForward
要困难,但如果你正仅仅导航到URL 且并不传递任何附加参数, 它的调用很容易. 举例来说, VB中导航到 Microsoft 主页, 可如下:WebBrowser1.Navigate &&VB代码调用Navigate 如 ...
自动化 Internet Explorer自动化打开了开发基于web应用的世界. 它允许你使用VB或者VC定制成熟的应用.自动化的好处:通过属性和方法可以改变IE的外观:你可以提供诸如导航条等用户接口以便控制用户的导航.自动化IE很容易.你建立一个简单的应用启动一个IE实例,然后使用控制webbrowser的途径- IWebBrowser2 接口来控制IE实 ...
使用VC++和COM API尽管使用VC不像Vb中那么容易自动化IE,但是也不太难,尤其是你理解了CON和COM API.无论你使用MFC, ATL, 或者标准 C++自动化IE,方法都是一样—你使用COM API来实现.VC++中创建一个Internet Explorer实例包括要调用COM API CoCreateInstance ,指定第一个参数为 C ...

我要回帖

更多关于 smart700iev3编程软件 的文章

 

随机推荐