VB.net 里的WebBrowser 怎么使用-WebBrowser指南

http://www.jituannet.com/archives/category/%E4%BA%92%E8%81%94%E7%BD%91/page/2


首先,必须有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

Shdocvw.dll包含了webbrowser control ,控制webbrowser control (就像控制其他任何activex com 控件一样),提供浏览能力给上层宿主。请注意webbrowser control位于第二级中。甚至IE也不直接而是通过shdocw.dll来使用webbrowser control的。尽管shdocvw提供了大部分的浏览功能,但是并不提供IE窗口的呈现功能。尽管如此,shdocvw还是提供了简单创建web 应用程序的能力。之后章节会讲到如何将ie的高级特性加入到你的应用程序。

MSHTML

早期的mshtml具有读取显示html的功能。MSHTML实际上是一个active 文档服务器,但是却可以作为其他控件的容器(如图中所示的)。记得吗,你可以将activex控件置于html中,此时mshtml就是一个 activex宿主,还可以控制其他的控件如vbscript 脚本引擎和javascript脚本引擎,java applet ,geszhong,各种插件—别意外,plug-in都是按照ie activex规范写的。

WebBrowser 怎么使用?

二、

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个属性。

方法描述

GoBack
导航到历史列表中的上一个页面

GoForward
导航到历史历表中的下一个项目

GoHome
导航到缺省页面.

GoSearch
导航到缺省搜索页面

Navigate
导航到一个页面或者页面

Refresh
刷新当前页面

Refresh2
可以选择刷新级别,如下:
REFRESH_NORMAL 普通刷新,并且不发送HTTP pragma:nocache 到服务器.
REFRESH_IFEXPIRED 仅仅当页面失效时才发送刷新请求
REFRESH_CONTINUE 内部使用,不要在编程时使用
REFRESH_COMPLETELY 发送HTTP pragma:nocache header 到服务器

Stop
停止当前导航

WebBrowser 怎么使用?尽管WebBrowser control 提供了你需要的导航回退以及前向的方法,但是没有提供存取历史列表的途径. 你可与直接通过属性LocationUR来获取当前页的URL.

在VB或者VC++中调用GoBack 和 GoForward 方法式很容易的.你可以使用WebBrowser control 或者 Internet Explorer对象. 举例来讲, 在VB中你可以如下调用:

WebBrowser1.GoBack           ‘ Hosting WebBrowser control
InternetExplorer1.GoForward  ’ Automating Internet Explorer object

VC++中如下:

m_webBrowser.GoBack();            // Hosting WebBrowser control
m_pInternetExplorer->GoForward(); // Automating Internet Explorer object

尽管 GoBack 和 GoForward  方法十分重要,当控制WebBrowser control或者自动化操作 Internet Explorer, Navigate is 却是最重要的方法. Navigate 允许你导航到特定的你所想的web页或者文件. Navigate 带有5个参数, 允许你指定特定的URL以实现导航以及其他定义导航行为的信息.

第一个参数是 URL, 指示web页的位置和名称或者何处的文件你想装载。 (此参数类型是 BSTR.) URL 可以是你所使用的标准URL 协议类型的一种,例如HTTP 和 FILE, 或者是全路经文件名的本地文件系统, 例如 C:\MyFile.htm.

第二个参数, Flags, 你可指定如何或者甚至何处装载特定的URL. (参数的类型是指向 VARIANT的指针) Flags 的值来自名为 BrowserNavConstants 的枚举类型 ,定义于 ExDisp.h 头文件中且有6个值, 详细解释见下列表. 你可以指定一个或者多个Flags 参数值 (请留意有些当前并未实现).

navOpenInNewWindow. 将导致一个新的窗口打开以显示URL. 缺省,如果你在自己的应用程序中控制 WebBrowser control,这些值将导致新的 Internet Explorer 浏览器窗口打开.
navNoHistory. 指定此URL将不加入到URL历史列表中
navNoReadFromCache. 当前未实现.
navNoWriteToCache. 当前未实现.
navAllowAutoSearch. 如果指定的URL未找到,自动搜索功能将试图导航到通常的顶级域名如.com .net .org以找到正确的URL。如果失败, URL将传递给搜索引擎.
navBrowserBar. 如果可能,将 URL 装入到 Explorer 的地址栏Bar。

第三个参数 TargetFrameName. 指定web页的哪一个frame将会发生导航. (参数的类型是指向 VARIANT的指针)此字符串将为以存在于web页中的名字或者一个指定的值如 _top 或 _search.
_top 值指定 URL 将被当前最顶层web页装入并不在任何一个当前页中存在的frame.
_search 指示搜索面板将被打开. (该值仅在你自动化操控Internet Explorer时发生.) 如果你指定的frame名称并未发现,, 新的Internet Explorer 窗口将被打开。

你可以使用 PostData 参数 (第四个)通过HTTPpost事务将指定特定的数据发送到服务器. (参数的类型是指向 VARIANT的指针) Post 处理用于将在HTML表单收集的数据发送到服务器。如果此参数不指定任何数据 ,  Navigate 方法将使用Get方法. 另外,如果你不指定 HTTP 协议的URL (换句话讲,如果你指定例如 FILE 协议的 URL), PostData 参数将被忽略。

你也可以使用第五个参数, Headers, 以发送HTTP 头信息到服务器. (T参数的类型是指向 VARIANT的指针) 这些加入的头信息将被 WebBrowser 控件如常发送出去. 作为 PostData 参数, 如果你并不指定第一个参数, Headers 将被忽略.WebBrowser 怎么使用?

3.http://dev.csdn.net/article/71/71866.shtm
调用 Navigate 方法比GoBack 以及 GoForward  要困难,但如果你正仅仅导航到URL 且并不传递任何附加参数, 它的调用很容易。 举例来说, VB中导航到 Microsoft 主页, 可如下:

WebBrowser1.Navigate “http://www.microsoft.com”;

VB代码调用Navigate 如此容易因为所有参数出第一个参数外都可以是可选. 如此相对照,VC++不可以省略任何参数. 如果你想使用VC++不是勇任何特别的参数导航到 Microsoft的 home page, 你必须传递空的VARIANT 结构。 MFC 应用程序,你必须如下调用 Navigate

COleVariant vtEmpty;
m_webBrowser.Navigate(_T(“http://www.microsoft.com”;), &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排序

属性

描述

Application

返回宿主WebBrowser 控件的自动化对象 (IDispatch) 实现,如果对象不可用,则返回的WebbOrwser控件的自动化对象

Parent

返回WebBrowser控件的父控件的自动化实现 (IDispatch) ,通常是容器—举例来讲,,您的宿主或者Internet Explorer 窗口。

Container

返回WebBrowser控件容器的自动化对象 (IDispatch) 。通常,该值返回同 Parent 属性一样的值。.

Document

返回活动文档的自动化实现 (IDispatch) 。如果 HTML 当前显示在WebBrowser, Document 属性给出你存取 DHTML 对象模型的途径.

TopLevelContainer

返回一个布尔值指示IE是否是WebBRowser控件的顶级容器。在 words中,如果IE是宿主应用承需则返回true

Type

返回已经在WebBrowser中装载的对象的类型。举例,如果HTML document被装载, Type 将返回 Microsoft HTML Document 5.0. 如果文档是Word 文档, Type 返回 Microsoft Word Document.

Left

.返回或设置控件在容器窗口左边距

Top

.返回或设置控件在容器窗口顶部边距

Width

返回或设置webbrowser控件在窗口中的水平方向的向苏为单位宽度

Height

返回或设置webbrowser控件在窗口中的处置方向的向像素为单位高度

LocationName

返回一个WebBrowser当前显示的资源名称的字符串 (换句话讲, HTML 页, Word 文档,,folder, 诸如此类) 。 如果资源是 HTML 页,字符串是标题。如果资源是文件或者文件夹,字符串为文件名或者文件夹名。—举例, foo.doc (Word文档)或者  Temp (temp directory.)

LocationURL

返回WebBrowser正在显示的资源的URL

Busy

返回一个布尔值指示WebBrowser 当前是否正在装入 URL.。如果当前属性返回 true, 你可以使用 Stop 方法取消代掉导航。

看完表 6-2, 清晰展示了你可使用的属性. 当中的一些可能需要更多的解释. IWebBrowser 使用的相当多的一个属性是 LocationURL, 给出了当前你装入WebBrowser窗口的 URL。 获取 LocationURL 值在VB中相当容易:

Dim strLocation
strLocation = WebBrowser1.LocationURL

Visual C++的MFC应用,  MFC 包装类使的访问LocationURL 很容易. 你简单调用 GetLocationURL 方法,该方法返回一个 CString 对象. 当你想在自动化IE中或者webBrowser的MFC应用中访问 LocationURL when automating Internet Explorer or when hosting the WebBrowser control in a C++ application that’s not built by using MFC, 你必须调用携带一指向BSTR的指针。 BSTR 将包含返回值. 此处展示如何在 C++中使用:

BSTR bstrURL;
m_pInternetExplorer->get_LocationURL(&bstrURL);

存取 Document 属性在VB中相当容易,当定义一个变量后(举例, HtmlDoc), 值需要 set 为 Document 属性:

Set HtmlDoc = WebBrowser1.Document

MFC 中也很容易,使用 MFC 包装类的GetDocument方法:

IDispatch* pDisp;
pDisp = m_webBrowser.GetDocument();

GetDocument 返回指向代表文档 IDispatch 接口的指针. 如果 GetDocument 失败, 该对象将为NULL.

非MFC C++ 应用或者任何自动化IE的C++ 应用访问Document 属性就只能够采用调用COM的方法—通过属性的get_方法. (注艺属性实只读,所以这里无put_ 方法.) 当调用 Document  的get_ 方法,你传递一个接受 IDispatch 的指针.此处展示了如何调用:

IDispatch* pDisp;
HRESULT hr = m_pInternetExplorer->get_Document(&pDisp);

当使用这些代码,你可以使用 SUCCEEDED 宏( Win32 API的一部分), 以监测调用是否成功。在尝试使用Idispatch接口前你应当确信调用成功。

4.http://dev.csdn.net/article/72/72068.shtm
IWebBrowserApp
IWebBrowserApp 接口仅仅在IE中实现。 典型的,你使用InternetExplorer 对象创建一个IE的实例. 然后你使用 IWebBrowserApp 接口操纵此实例. (今天采用IWebBrowser2 替代) IWebBrowserApp 接口继承自 IWebBrowser, 所以它提供 IWebBrowser 的全部功能。

因为IWebBrowserApp呈现一个IE窗口的实例, 所以它的方法和属性典型地允许你控制浏览器窗口的用户接口。 这些方法和属性并非包含在WebBrowser的 IWebBrowser 中的:寄宿control的应用程序提供诸如状态条, 工具条, 以及菜单条等用户接口. WebBrowser 控件仅仅用于装载web页以及其它类型文件。

IWebBrowserApp 有4个方法和10 各属性。

方法 IWebBrowserApp 接口的属性很直观立如下表, 但是有2个有理由值的讨论:GetProperty 和 PutProperty. 此两个方法允许你在IE属性包(property bag)中存储一个属性一边你能够在其后重新找回他们。 你将典型地从一个web页上存储一些状态信息到另一个web页 (事实上,使用IWebBrowser2 接口你可以在宿主一个WebBrowser 控件时候使用此方法)

Table 6-3. IWebBrowserApp  vtable 次序的方法

方法

描述

Quit

促使 Internet Explorer 窗口关闭。换句话讲,将自动化操作关闭IE实例

ClientToWindow

转换一个点从窗口坐标到客户坐标。

PutProperty

存储一个属性值到ie的属性包,将可以随手采用GetProperty.获取

GetProperty

获取先前由 PutProperty.方法存储的属性值

WebBrowser 怎么使用?
VB代码:

InternetExplorer1.PutProperty “CurrentPicture”, 10
InternetExplorer1.GetProperty(“CurrentPicture”)

VC++代码:

CSomeClass::PutGetProperty(VARIANT vtCurrentvalue, VARIANT* vtNewvalue)
{
HRESULT hr;
hr = m_pInternetExplorer->PutProperty(L”CurrentPicture”,
vtCurrentvalue);

if (SUCCEEDED(hr))
{
// Notice that vtNewvalue is already a pointer, so you
// don’t have to pass the address to GetProperty.
//
hr = m_pInternetExplorer->GetProperty(L”CurrentPicture”,
vtNewvalue);
}

return hr;
}

PutGetProperty 方法接受包含当前属性值的 VARIANT 变量指针且将接收属性值。

属性 IWebBrowserApp 接口有10 个属性. Table 6-4. IWebBrowserApp vtable 次序的属性

属性

描述

Name

返回对象的名称t. (举例,当自动化IE, Name 属性将返回 Microsoft Internet Explorer.)

HWND

返回IE窗口的句柄

FullName

返回ie可执行文件的全路径 (iexplore.exe).

Path

返回IE应用程序的全路径.

Visible

监测和设置IE窗口是否可见。 (换句话讲,你可与使用此属性显示/隐藏)

StatusBar

显示或者隐藏IE状态条,也可监测当前状态条

StatusText

设置或隐藏状态条文字

ToolBar

显示或者隐藏IE工具条,也可监测当前工具条状态

MenuBar

显示或者隐藏IE菜单条,也可监测当前工具菜单态

FullScreen

设置或者检测一个值指示IE当前是否最大化显示。最大化显示,iE占据整个屏幕

Table 6-4 中的属性列表直截了当且易于使用。举例来说, 如果你想从你的Vb程序中获取IE状态条中的文字,你应当使用如下代码:

Dim strStatusText
strStatusText = InternetExplorer1.StatusText

使用MFC包装类的VC++程序代码如下:

BSTR bstrStatusText;
HRESULT hr = m_pInternetExplorer->get_StatusText(&bstrStatusText);

IWebBrowser2
因为COM规则要求接口恒久不变, 要加入新的工呢高COM,你必须增加新的接口。 新的接口可扩展自其他接口已扩展功能。 举例,当心的需求引入WebBrowser 和Internet Explorer 接口, 开发者被要求建立一个新的接口: IWebBrowser2.

早期, IWebBrowser2 继承自 IWebBrowser 和 IWebBrowserApp, 还提供不包含在着两个接口中的功能. 所以你应当使用 IWebBrowser2 接口替代 来操纵WebBrowser 控件或者 Internet Explorer.

IWebBrowser2 接口有4个方法和8个属性.

方法   IWebBrowser2 接口方法如下描述,按照 vtable 次序, in Table 6-5.

也许IWebBrowser2 、接口踵使用最多的方法是ExecWB. 它通过WebBrowser实现了一个  IOleCommandTarget 接口的Exec的包装实现。 在 ExecWB 方法 被创建前, 你不可以直接从VB中调用IOleCommandTarget::Exec, 因为VB不可访问 IOleCommandTarget 接口 ,因而VB不可直接使用该接口的ExecWB方法。 IOleCommandTarget::Exec 方法过去大量使用,所以 WebBrowser 开发者决定创建ExecWB 以使事情变得容易。

Table 6-5. IWebBrowser2  Vtable 次序的方法

方法

描述

Navigate2

功能基于Navigate 方法,不同在于 Navigate2 允许你导航到飞URL表达的地方,例如Windows shell folder. (Windows shell folder 是指向标示符指针, 或者windows shell命名空间中的 PIDL,)

QueryStatusWB

IoleCommandTarget接口的QueryStatus方法在 WebBrowser.中的包装实现

ExecWB

IoleCommandTarget接口的Exec方法在 WebBrowser.中的包装实现

ShowBrowserBar

显示或者隐藏特定的浏览器条. 该方法仅仅用于InternetExplorer 对象

为什么你无论如何都要调用ExecWB方法?因为它提供了你需要的功能(通过IOleCommandTarget::Exec)不是暴露于 webbrowser接口。你大概疑惑于为社么开发者不实现扩展属性和方法。记住:COM规则是一旦接口发表就不可改变。所以你不能够不能增加功能而不创 建新的接口。

ExecWB 方法允许WebBrowser 开发者增加新的功能而不用创建新的接口。再之, 那是由WebBrowser 通过 ExecWB 代表性的暴露不常用的工的途径, 譬如调用 Save As 对话框或者缩放web页的字体。  ExecWB 工作的方法是传递一个你想调用的command ID 和必需的参数. 太多的 command IDs ,他们包含于OLECMDID 实现文档头文件he DocObj.h .

作为举例, 支持缩放web页的内容字体。Internet Explorer 允许你通过View菜单的Text Size子菜单改变字体的大小从最小到最大。 ExecWB 方法暴露了允许你改变显示在浏览器中的文字大小。对于Zoom 命令, 你可指定特殊值0, 1, 2, 3, or 4,  0 是最小字体 ,4是最大字体。以下举例为改变字体为最大(VB):

WebBrowser1.ExecWB OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, _
CLng(4), Null

再次代码中, 我调用 ExecWB 方法, 传递OLECMDID_ZOOM 常量给第一个参数. 此常量指定 zoom 操作将被执行。 第二个参数传递给ExecWB 不要提示用户。另外的选择, 你可以提醒用户而是用OLECMDEXECOPT_PROMPTUSER. (见 DocObj.h.)

第三个输入参数指示要设定的文字尺寸。我想是文字尽可能的大,所以我指定了4 。注意我在调用中使用了VB的Clng函数包装此值,转换我指定的此值为一个variant—输入需要的类型.最后为一个输出参数包含任何返回值。因为返回值不需要关心,我传递Null.

属性 IWebBrowser2 接口有8个属性。 (Table 6-6 按照vtable次序展示其)。他们都很直观,我仅仅解释恰宏很特别的一个—AddressBar.

Table 6-6. IWebBrowser2 Properties in Vtable Order

属性

描述

ReadyState

返回WebBrowser 的状态(换句话讲 ,该属性指示文档是否完成装载). 尽管你可以使用 ReadyState 属性, 使用 DocumentComplete 时间检测文档是否装载还是比较好些。 (那意味着所有HTML和文档被装载

Offline

.返回或者设置检测webbrowser是否处于脱机模式的变量

Silent

返回或设置 WebBrowser 是否处于沉默模式。如果处于沉默模式,意味着没有对话框可以被显示.

RegisterAsBrowser

.设置或者检测Webbrowser是否是作为顶层浏览器被登记

RegisterAsDropTarget

.设置或返回WebBrowser是否作为导航的拖放对象 。如果登记委托放对象,用户可直接拖放连接到浏览器

TheaterMode

返回或者设置Internet Explorer是否处于theater 或者 normal window 模式.。在theater 模式, Internet Explorer占据整个屏幕就像处于FullScreen 模式,但也有最小化的用户接口元素 (此属性仅仅展示于InternetExplorer 对象)

AddressBar

显示或者隐藏地址栏(此属性仅仅展示于InternetExplorer 对象)

Resizable

返回或者设置Internet Explorer是否可被调整大小, 你可利用此属性防止用户改变webbrowser的大小(此属性仅仅展示于InternetExplorer 对象)

AddressBar 属性允许你显示/隐藏Internet Explorer 地址栏—一个包含可输入URL的文本框 允许你导航到某个Url。 能够显示或者隐藏地址条允许你完全控制你的用户的导航体验

在你的企业网络或者中小学控制用户导航体验.在此环境下,你将控制用户的导航以至于可确定某些不恰当地页面不可访问。你可创建你自己的浏览器。但是如果你 没有时间和资源这么做,你可以自动化IE来代替.自动化IE允许你管掉所有的用户界面允许用户导航到某个web页,像菜单条, 工具条,以地址栏. 之后你可建立一定数量的可访问web页连接列表给用户。

关掉这些用户接口很容易. VB代码:

InternetExplorer1.AddressBar = False
InternetExplorer1.ToolBar = False
InternetExplorer1.MenuBar = False

5.在工程中引用Microsoft Internet Controls对象,然后加入以下代码:

Dim WebCount As SHDocVwCtl.ShellWindows
Set WebCount = New SHDocVwCtl.ShellWindows
MsgBox “已经打开” & WebCount.Count & “个网页”

执行后能得到Microsoft Internet Explorer 和 Maxthon(遨游,原名:MyIE2)浏览器打开的网页个数

Dim dWinFolder As New ShellWindows

Private Sub Form_Load()
Dim objIE As Object

For Each objIE In dWinFolder
If InStr(1, objIE.FullName, “IEXPLORE.EXE”, vbTextCompare) <> 0 Then
List1.AddItem objIE.LocationURL
End If
Next
Command1.Caption = “正文”
End Sub

‘以下是遍历所有的IE窗口,包括MyIE等基于IE控件的其他浏览器。
‘我在windows2000+myie2调试通过。至于你说用控件可以解决,我好像还没看到这样的控件。
”””””””””””””””””””””””””””””””””””””””’
‘Addressof 一定要放在标准模块中,所以以下部分放在标准模块中,在外面调用 GetAllIEAddress 就是

Option Explicit

Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type

‘相关 API 函数声明
Private Declare Function SendMessageByString Lib “user32″ Alias “SendMessageA” (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
Private Declare Function FindWindow Lib “user32″ Alias “FindWindowA” (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function RegisterWindowMessage Lib “user32″ Alias “RegisterWindowMessageA” (ByVal lpString As String) As Long
Private Declare Function SendMessageTimeout Lib “user32″ Alias “SendMessageTimeoutA” (ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long, ByVal fuFlags As Long, ByVal uTimeout As Long, lpdwResult As Long) As Long
Private Declare Function FindWindowEx Lib “user32″ Alias “FindWindowExA” (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Const SMTO_ABORTIFHUNG = &H2
Private Declare Function ObjectFromLresult Lib “oleacc” (ByVal lResult As Long, riid As GUID, ByVal wParam As Long, ppvObject As Any) As Long

Private Declare Function EnumWindows Lib “user32″ (ByVal lpEnumFunc As Any, ByVal lParam As Long) As Long    ’枚举窗口列表中的所有父窗口(顶级和被所有窗口)
Private Declare Function GetWindowText Lib “user32″ Alias “GetWindowTextA” (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long     ‘取得指定窗口的司法题
Private Declare Function GetClassName Lib “user32″ Alias “GetClassNameA” (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long     ‘为指定的窗口取得类名
Private Declare Function GetWindow Lib “user32″ (ByVal hwnd As Long, ByVal wCmd As Long) As Long  ’取得窗口句柄
Private Declare Function SendMessage Lib “user32″ Alias “SendMessageA” (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long ‘发送消息
Private Const GW_CHILD = 5
Private Const GW_HWNDNEXT = 2
Private Const WM_GETTEXT = &HD
Private Const WM_GETTEXTLENGTH = &HE

Private strIEAddress As String

Public Function GetAllIEAddress() As String
strIEAddress = “”

EnumWindows AddressOf EnumProc, 0

‘    If strIEAddress <> “” Then
‘        GetIEAddress = “”
‘        GetIEAddress = GetIEAddress & “<Data>”
‘        GetIEAddress = GetIEAddress & “<DateTime>” & Format(Now, “yyyy-MM-dd HH:mm:ss”) & “</DateTime>”
‘        GetIEAddress = GetIEAddress & “<TypeID>2</TypeID>”
‘        GetIEAddress = GetIEAddress & “<Title>” & ReplaceXMLIn(strIEAddress) & “</Title>”
‘        GetIEAddress = GetIEAddress & “</Data>”
‘    Else
‘        GetIEAddress = “”
‘    End If

End Function

‘遍查主窗口
Private Function EnumProc(ByVal app_hwnd As Long, ByVal lParam As Long) As Boolean
Dim buf As String * 1024
Dim Length As Long
Dim title As String

‘得到窗体标题,这里没有用上
‘Length = GetWindowText(app_hwnd, buf, Len(buf))
‘title = Trim(StripTerminator(buf))

Dim strClassName As String * 1024
Length = GetClassName(app_hwnd, strClassName, Len(strClassName))
strClassName = Trim(StripTerminator(LCase(strClassName)))

‘判断是否为 IE 浏览器窗口
If InStr(1, strClassName, “ieframe”) > 0 Then
GetSubWin app_hwnd, “IEFrame”, “Internet Explorer_Server”
End If

EnumProc = 1
End Function

‘递归遍查子窗口
Private Function GetSubWin(window_hwnd As Long, ByVal WinClassName As String, ByVal SubWinClassName As String) As String
On Error GoTo ErrHandler
Dim buf As String
Dim buflen As Long
Dim child_hwnd As Long
Dim children() As Long
Dim num_children As Integer
Dim i As Integer
buflen = 256
buf = Space$(buflen – 1)
buflen = GetClassName(window_hwnd, buf, buflen)
buf = Left$(buf, buflen) ‘取得子窗口的类名

If SubWinClassName = “Internet Explorer_Server” Then
If LCase(Right(buf, Len(SubWinClassName))) = LCase(SubWinClassName) Then
If InStr(1, LCase(WinClassName), “ieframe”) > 0 Then
GetIEAddress window_hwnd
End If
End If
End If

num_children = 0
child_hwnd = GetWindow(window_hwnd, GW_CHILD) ‘取得第 1 个子窗口的句柄

Do While child_hwnd <> 0 ‘如果有子窗口
num_children = num_children + 1
ReDim Preserve children(1 To num_children)
children(num_children) = child_hwnd
child_hwnd = GetWindow(child_hwnd, GW_HWNDNEXT) ‘取得下一个兄弟窗口的句柄
Loop

For i = 1 To num_children
Dim strRet As String
strRet = GetSubWin(children(i), WinClassName, SubWinClassName)
If strRet <> “” Then Exit For
Next i

ErrHandler:

End Function

Private Sub GetIEAddress(IEWid As Long)

Dim hwId As Long
‘hwId = FindWindow(“IEFrame”, vbNullString)
‘hwId = FindWindowEx(hwId, 0, “Shell DocObject View”, vbNullString)
‘hwId = FindWindowEx(IEWid, 0, “Internet Explorer_Server”, vbNullString)

Dim lMsg As Long
lMsg = RegisterWindowMessage(“WM_HTML_GETOBJECT”)
Dim lRes As Long

SendMessageTimeout IEWid, lMsg, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes

Dim IID_IHTMLDocument As GUID

IID_IHTMLDocument.Data1 = &H626FC520
IID_IHTMLDocument.Data2 = &HA41E
IID_IHTMLDocument.Data3 = &H11CF

IID_IHTMLDocument.Data4(0) = &HA7
IID_IHTMLDocument.Data4(1) = &H31
IID_IHTMLDocument.Data4(2) = &H0
IID_IHTMLDocument.Data4(3) = &HA0
IID_IHTMLDocument.Data4(4) = &HC9
IID_IHTMLDocument.Data4(5) = &H8
IID_IHTMLDocument.Data4(6) = &H26
IID_IHTMLDocument.Data4(7) = &H37

Dim myInstance As MSHTML.IHTMLDocument5

ObjectFromLresult lRes, IID_IHTMLDocument, 0, myInstance

If Not (myInstance Is Nothing) Then
Debug.Print myInstance.url
Debug.Print myInstance.nameProp
‘Debug.Print myInstance.documentElement.outerHTML
‘DebugChildren myInstance
End If

End Sub

‘去除非vb字符。
Public Function StripTerminator(ByVal strString As String) As String
Dim intZeroPos As Integer
intZeroPos = InStr(strString, Chr$(0))
If intZeroPos > 0 Then
StripTerminator = Left$(strString, intZeroPos – 1)
Else
StripTerminator = strString
End If
End Function

 
7.””””””””””””””””
‘这里可以debug到它的全部html源码,呵呵,独家珍藏
Option Explicit

Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type

Private Declare Function SendMessageByString Lib “user32″ Alias “SendMessageA” (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
Private Declare Function FindWindow Lib “user32″ Alias “FindWindowA” (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function RegisterWindowMessage Lib “user32″ Alias “RegisterWindowMessageA” (ByVal lpString As String) As Long
Private Declare Function SendMessageTimeout Lib “user32″ Alias “SendMessageTimeoutA” (ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long, ByVal fuFlags As Long, ByVal uTimeout As Long, lpdwResult As Long) As Long
Private Declare Function FindWindowEx Lib “user32″ Alias “FindWindowExA” (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Const SMTO_ABORTIFHUNG = &H2
Private Declare Function ObjectFromLresult Lib “oleacc” (ByVal lResult As Long, riid As GUID, ByVal wParam As Long, ppvObject As Any) As Long

‘Form1.frm 文件
‘————–

Private Sub Command1_Click()

Dim hwId As Long

hwId = FindWindow(“IEFrame”, vbNullString)
hwId = FindWindowEx(hwId, 0, “Shell DocObject View”, vbNullString)
hwId = FindWindowEx(hwId, 0, “Internet Explorer_Server”, vbNullString)

Dim lMsg As Long
lMsg = RegisterWindowMessage(“WM_HTML_GETOBJECT”)
Dim lRes As Long

SendMessageTimeout hwId, lMsg, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes

Dim IID_IHTMLDocument As GUID

IID_IHTMLDocument.Data1 = &H626FC520
IID_IHTMLDocument.Data2 = &HA41E
IID_IHTMLDocument.Data3 = &H11CF

IID_IHTMLDocument.Data4(0) = &HA7
IID_IHTMLDocument.Data4(1) = &H31
IID_IHTMLDocument.Data4(2) = &H0
IID_IHTMLDocument.Data4(3) = &HA0
IID_IHTMLDocument.Data4(4) = &HC9
IID_IHTMLDocument.Data4(5) = &H8
IID_IHTMLDocument.Data4(6) = &H26
IID_IHTMLDocument.Data4(7) = &H37

‘Debug.Print “{626FC520-A41E-11CF-A731-00A0C9082637}”        ’IHTMLDocument

‘IID_IHTMLDocument.Data4 = “626FC520-A41E-11CF-A731-00A0C9082637″
Dim myInstance As MSHTML.IHTMLDocument5

ObjectFromLresult lRes, IID_IHTMLDocument, 0, myInstance

If Not (myInstance Is Nothing) Then
‘Debug.Print myInstance.body.children.length
Debug.Print myInstance.url
Text1.Text = myInstance.documentElement.outerHTML
‘DebugChildren myInstance

End If

End Sub

 

8.获取webbrowser控件 网页的源码(收藏)
我在网上找到使用rft控件保存webbrowse文本  txtHtml是RichTextBox
txtHTML.Text = WebBrowser1.document.body.innerText
‘flag :rsftext 保存为txt文件,strtmp文件路径
txtHTML.saveFile strtmp, rtfText

将其name属性设置为web

Private Sub Command1_Click()
web.Navigate “www.google.com”
End Sub

Private Sub web_DocumentComplete(ByVal pDisp As Object, URL As Variant)
Set doc = web.Document
For Each i In doc.All
msgbox typename(i)
Text1.Text = Text1.text & vbclrf & i.innertext
Next
End sub

===========================================================================================
转载

‘引用 Microsoft HTML Object Library

Dim oDoc As HTMLDocument
Dim oElement As Object
Dim oTxtRgn As Object
Dim sSelectedText As String

Set oDoc = WebBrowser1.Document’获得文档对象
Set oElement = oDoc.getElementById(“T1″)’获得ID=”T1″的对象
Set oTxtRgn = oDoc.selection.createRange’获得文档当前正选择的区域对象

sSelectedText = oTxtRgn.Text’选择区域文本赋值

oElement.Focus’”T1″对象获得焦点

oElement.Select’全选对象”T1″

Debug.Print “你选择了文本:” & sSelectedText

上面这段儿还附送了其他功能,呵呵。精简一下是这样:
Dim oDoc As Object
Dim oTxtRgn As Object
Dim sSelectedHTML As String

Set oDoc = WebBrowser1.Document ‘获得文档对象
Set oTxtRgn = oDoc.selection.createRange ‘获得文档当前正选择的区域对象

sSelectedHTML = oTxtRgn.htmlText ‘选择区域文本赋值

Text1.Text=sSelectedHTML ‘文本框显示抓取得HTML源码
……’或者继续分析源码

==================================================================================================

我用WebBrowser取得网页源码,直接运行正常,但在编译后出错
Private Sub Command1_Click()
WebBrowser1.Navigate “http://www.sdqx.gov.cn/sdcity.php”;
End Sub

Private Sub WebBrowser1_DownloadComplete()
‘页面下载完毕
Dim doc, objhtml
Set doc = WebBrowser1.Document

Set objhtml = doc.body.createtextrange()
If Not IsNull(objhtml) Then
Text1.Text = objhtml.htmltext
End If

End Sub

我用WebBrowser取得网页源码,直接运行正常,但在编译后出错

提示:实时错误“91”    Object 变量或 with 块变量没有设置
可能是没有下载完所致,

Private Sub WebBrowser1_DownloadComplete()
if webbrowser.busy=false then
Dim doc, objhtml
Set doc = WebBrowser1.Document

Set objhtml = doc.body.createtextrange()
If Not IsNull(objhtml) Then
Text1.Text = objhtml.htmltext
End If
end if
End Sub

你要得网页源码用 xmlhttp比较好

先引用 msxml

Dim x As New MSXML2.XMLHTTP
x.open “get”, “http://www.sina.com”;, False
x.send

MsgBox StrConv(x.responseBody, vbUnicode)

===============================================================================================
我在网上找到使用rft控件保存webbrowse文本  txtHtml是RichTextBox
txtHTML.Text = WebBrowser1.document.body.innerText
‘flag :rsftext 保存为txt文件,strtmp文件路径
txtHTML.saveFile strtmp, rtfText

=====================================================================================

Private Sub WebBrowser1_DownloadComplete()
Dim objHtml As Object
‘下载完成时状态栏显示“Link Finished”
Set objHtml = Me.WebBrowser1.Document.Body.Createtextrange()
If Not IsNull(objHtml) Then
Text1.Text = objHtml.htmltext
End If
End Sub
使用inet控件
Source1 = Inet1.OpenURL(“www.csdn.net”)
If Source1 <> “” Then
RichTextBox1.Text = Source1
Me.Inet1.Cancel
Else
Source = MsgBox(“Source code is not available.”, vbInformation, “Source Code”)
End If

Private Sub Command1_Click()
Text1.Text = WebBrowser1.Document.body.innerHTML
End Sub

==================================================================================
加入timer,commandbutton,text
private sub command1_click()
webbrowser1.navigate http://www.sohu.com/
timer1.enabled=true
end sub

private sub timer1_timer()
dim doc,objhtml as object
dim i as integer
dim strhtml as string

if not webbrowser1.busy then
set doc=webbrowser1.document
i=0
set objhtml=doc.body.createtextrange()
if not isnull(objhtml) then
text1.text=objhtml.htmltext
end if
timer1.enabled=false
end if
end sub

Dim doc, objhtml As Object
If Not webbrowser1.Busy Then
Set doc = webbrowser1.Document
Set objhtml = doc.body.createtextrange()
If Not IsNull(objhtml) Then
text1.text=objhtml.htmltext
End If
Set doc = Nothing
Set objhtml = Nothing

End If

===================================================================================================
或者试试用InternetReadFile,效果也可以:
Option Explicit

Private Declare Function InternetOpen Lib “wininet.dll” Alias “InternetOpenA” ( _
ByVal sAgent As String, ByVal lAccessType As Long, _
ByVal sProxyName As String, ByVal sProxyBypass As String, _
ByVal lFlags As Long) As Long
Private Declare Function InternetOpenUrl Lib “wininet.dll” Alias “InternetOpenUrlA” ( _
ByVal hInternetSession As Long, ByVal sUrl As String, _
ByVal sHeaders As String, ByVal lHeadersLength As Long, _
ByVal lFlags As Long, ByVal lContext As Long) As Long
Private Declare Function InternetReadFile Lib “wininet.dll” ( _
ByVal hFile As Long, ByVal sBuffer As String, _
ByVal lNumBytesToRead As Long, _
lNumberOfBytesRead As Long) As Integer
Private Declare Function InternetCloseHandle Lib “wininet.dll” ( _
ByVal hInet As Long) As Integer
Private Const INTERNET_FLAG_NO_CACHE_WRITE = &H4000000
Dim s

Private Function GetUrlFile(stUrl As String) As String
Dim lgInternet As Long, lgSession As Long
Dim stBuf As String * 1024
Dim inRes As Integer
Dim lgRet As Long
Dim stTotal As String
stTotal = vbNullString
lgSession = InternetOpen(“VBTagEdit”, 1, vbNullString, vbNullString, 0)
If lgSession Then
lgInternet = InternetOpenUrl(lgSession, stUrl, vbNullString, _
0, INTERNET_FLAG_NO_CACHE_WRITE, 0)
If lgInternet Then
Do
inRes = InternetReadFile(lgInternet, stBuf, 1024, lgRet)
stTotal = stTotal & Mid$(stBuf, 1, lgRet)
Loop While (lgRet <> 0)
End If
inRes = InternetCloseHandle(lgInternet)
End If
GetUrlFile = stTotal
End Function

Private Sub Command1_Click()
Text1.Text = GetUrlFile(“http://adsl.tsee.net/teleplay/view.asp?id=143″;)
End Sub

=====================================================================================================

Set vDoc = WebBrowser1.Document
‘获取网页的源码
For Each o In vDoc.All
DoEvents
htmlpage = htmlpage & o.innerHTML
Next
然后用写二进制文件的方法将htmlpage的内容写入到.html文件中如果这个网页中含有框架那么要对框加进行处理。

=======================================================================================================================


  • 3
    点赞
  • 0
    评论
  • 4
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值