webbrowser delphi 事件详解

基础说明

方法:

GoBack 后退,使你在当前历史列表中后退一项,Alt + ←
GoForward 前进,使你在当前历史列表中前进一项,Alt + →
GoHome 主页,连接用户默认的主页
GoSearch 搜索,连接用户默认的搜索页面
Navigate 连接到指定的URL
Refresh 刷新当前页面,F5
Refresh2 同上,只是可以指定刷新级别,所指定的刷新级别的值来自RefreshConstants枚举表,该表定义在ExDisp.h中,可以指定的不同值如下: 
REFRESH_NORMAL 执行简单的刷新,不将 HTTP  pragma: no-cache头发送给服务器 
REFRESH_IFEXPIRED 只有在网页过期后才进行简单的刷新 
REFRESH_CONTINUE 仅作内部使用。在MSDN里写着DO NOT USE! 请勿使用 
REFRESH_COMPLETELY 将包含pragma: no-cache头的请求发送到服务器
Stop 停止,停止当前页面及其内容的载入

属性:
Application 如果该对象有效,则返回掌管WebBrowser控件的应用程序实现的自动化对象(IDispatch)。如果在宿主对象中自动化对象无效,这个程序将返回WebBrowser控件的自动化对象 
LocationName 返回一个字符串,该字符串包含着WebBrowser当前显示的资源的名称,如果资源是网页就是网页的标题;如果是文件或文件夹,就是文件或文件夹的名称 
LocationURL 返回WebBrowser当前正在显示的资源的URL
Busy 返回一个Boolean值,说明WebBrowser当前是否正在加载URL,如果返回true,就可以使用stop方法来撤销正在执行的访问操作
Document 为活动的文档返回自动化对象。如果HTML当前正被显示在WebBrowser中,则Document属性提供对DHTML Object Model的访问途径 
TopLevelContainer 返回一个Boolean值,表明IE是否是WebBrowser控件顶层容器,是就返回true
Type 返回已被WebBrowser控件加载的对象的类型。例如:如果加载.doc文件,就会返回Microsoft Word Document
----------以下可以直接无视----------
Parent 返回WebBrowser控件的父自动化对象,通常是一个容器,例如是宿主或IE窗口
Container 返回WebBrowser控件容器的自动化对象。通常该值与Parent属性返回的值相同
Left 返回或设置WebBrowser控件窗口的内部左边与容器窗口左边的距离 
Top 返回或设置WebBrowser控件窗口的内部左边与容器窗口顶边的距离 
Width 返回或设置WebBrowser窗口的宽度
Height 返回或设置WebBrowser窗口的高度

事件:
BeforeNavigate2 导航发生前激发,刷新时不激发,一般在此获取完整的 URL 字符串
CommandStateChange 当命令的激活状态改变时激发。此判断页面是否可以前进后退,以激活或禁用前进后退按钮
DocumentComplete 当整个文档完成时激发,刷新页面时不激发
DownloadBegin 当某项下载操作已经开始后激发,刷新页面时激发
DownloadComplete 当某项下载操作已经完成后激发,刷新页面时激发
NavigateComplete2 导航完成后激发,刷新页面时不激发
NewWindow2 在创建新窗口以前激发
OnFullScreen 当FullScreen属性改变时激发,采用一个类型为Boolean的输入参数来指示FullScreen属性
OnMenuBar 当MenuBar属性改变时激发,用法同上
OnStatusBar 当StatusBar属性改变时激发,用法同上
OnToolBar 当StatusBar属性改变时激发,用法同上
OnVisible 控制窗口的可见或隐藏,用法同上(经测试Visual属性改变时不会激发)
OnQuit 无论是用户关闭浏览器还是开发者调用Quit方法,当IE退出时就会激发
StatusTextChange 状态文字改变时被激发,但它并不理会程序是否有状态栏 
TitleChange Title有效或改变时激发

=========================下面的暂时没有整理========================== 

请问:在WebBrwoser控件里提供的Navigate或者Navigate2方法中提供了传递数据
的参数,调用方式为:WebBrowser1.Navigate2(URL,[Flags],
[TargetFrameName],[PostData],[Headers]) 
其中PostData参数就是一个提交参数字符串,例如"name=aaa&password=123",
但问题是为什么这个方法并不是有效的,服务器端不能取得数据? 
如果这个方法是有效的话就不需要用一段html 代码 模拟这种调用了。
下面代码能检测出程序post出去的消息
Private Sub WebBrowser1_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers As Variant, Cancel As Boolean) 
MsgBox PostData 
End Sub

如何利用 WebBrowser 控件,显示 .GIF 动画?
要有一定的网页知识(HTML、JavaScript、CSS) 
注意细节: 
没有"滚动条"和"鼠标右键弹出的 IE 上下文菜单",".HTM 源文件" ... 
我写了一个,效果还真不错!
'Objects: Form1、Command1、CommonDialog1、WebBrowser1 
Option Explicit 
Private Sub Command1_Click() 
CommonDialog1.ShowOpen 
If VBA.Len(VBA.Trim(CommonDialog1.FileName)) > 0 Then 
Dim p As stdole.StdPicture 
Dim sPath As String 
sPath = VBA.Trim(VBA.Trim(CommonDialog1.FileName)) 
Set p = VB.LoadPicture(sPath) 
WebBrowser1.Width = p.Width * 16 / 26 
WebBrowser1.Height = p.Height * 16 / 26 
' WebBrowser1.Navigate "about:blank" 
WebBrowser1.Document.open 
WebBrowser1.Document.writeln "" 
WebBrowser1.Document.writeln "" 
WebBrowser1.Document.writeln "" 
WebBrowser1.Document.writeln "" 
WebBrowser1.Document.writeln "WebBrowser1.Document.writeln " 
WebBrowser1.Document.writeln "WebBrowser1.Document.writeln "

WebBrowser1.Document.writeln "" 
WebBrowser1.Document.writeln "" 
End If 
End Sub 
Private Sub Form_Load() 
Command1.Caption = "&Open" 
WebBrowser1.Navigate "about:blank" 
WebBrowser1.Document.open 
WebBrowser1.Document.writeln "" 
WebBrowser1.Document.writeln "" 
WebBrowser1.Document.writeln "" 
WebBrowser1.Document.writeln "" 
WebBrowser1.Document.writeln "WebBrowser1.Document.writeln "" 
WebBrowser1.Document.writeln "" 
WebBrowser1.Document.Close 
End Sub
=======================================================================
看到很多关于WebBrowser控件禁止右键的提问,回复的方法很多,其中有提到使用微软提供的Webbrowser扩展COM服务器对象 (WBCustomizer.dll),但是该方法在我们想使用Webbrowser编辑网页 (Webbrowser1.Document.execCommand editMode)的时候有很多弊端,比如不能显示选中的文本等。另有些方法也就不用一一列举了。
这儿我想提到的是关于MSHTML.HTMLDocument
引用Microsoft HTML OBject Library
Rem #窗体代码#
Dim WithEvents M_Dom As MSHTML.HTMLDocument 
Private Function M_Dom_oncontextmenu() As Boolean 
M_Dom_oncontextmenu = False 
End Function
Private Sub Webbrowser1_DownloadComplete() 
Set M_Dom = Webbrowser1.Document 
End Sub
Rem 好了,右键菜单没有了
=======================================================================
控件调用和获得收藏夹里面
基本上用 specialfolder(6 ) 就可以得到收藏夹的路径, 然后你可以用dir去循环读入每个目录,然后dir里面的file, file的名字就是你要的收藏的名字, 路径可以自己根据从上面得到的路径去得到. 
如果你不用dir也可以用vb的dir控件. 
Private Type SHITEMID 
cb As Long 
abID As Byte 
End Type
Public Type ITEMIDLIST 
mkid As SHITEMID 
End Type 
Public Function SpecialFolder(ByRef CSIDL As Long) As String 
locate the favorites folder 
Dim R As Long 
Dim sPath As String 
Dim IDL As ITEMIDLIST 
Const NOERROR = 0 
Const MAX_LENGTH = 260 
R = SHGetSpecialFolderLocation(MDIMain.hwnd, CSIDL, IDL) 
If R = NOERROR Then 
sPath = Space$(MAX_LENGTH) 
R = SHGetPathFromIDList(ByVal IDL.mkid.cb, ByVal sPath) 
If R Then 
SpecialFolder = Left$(sPath, InStr(sPath, vbNullChar) - 1) 
End If 
End If 
End Function 
================================================================
选择网页上的内容。 
Private Sub Command1_Click() 
请先选中一些内容 
Me.WebBrowser1.ExecWB OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT 
MsgBox Clipboard.GetText 
End Sub
============================================================= 

2、弹出Webbrowser消息窗口 

Dim oWindow 
Set oWindow = WebBrowser1.Document.parentWindow 
oWindow.confirm "abcd" 

VB调用webbrowser技巧集2 

向Webbrowser中写入HTML内容的几种方法 

首先在Form_Load中加入 

WebBrowser1.Navigate "about:blank" 

确保Webbrowser1可用 


方法1: 

Dim s As String 
Dim stream As IStream 

s = "" 
s = s + "" 
s = s + "" 
s = s + " 

hello world 


s = s + "" 
s = s + " 
WebBrowser1.Document.Write s 


方法2: 

Dim o 

Set o = WebBrowser1.Document.selection.createrange 
Debug.Print o 
If (Not o Is Nothing) Then 
o.pasteHTML "哈哈" 
Set o = Nothing 
End If 


方法3: 

'插入文本框 
Dim o 

Set o = WebBrowser1.Document.selection.createrange 

o.execCommand "InsertTextArea", False, "xxx" 

1、页面滚动: 

Private Sub Command2_Click() 
WebBrowser1.Document.parentwindow.scrollby 0, 30 
End Sub 

Private Sub Form_Load() 
WebBrowser1.Navigate "http://www.applevb.com" 
End Sub 


点击Command2就可以使当前页面向下滚动30像素 


2、判断页面是否可以前进后退 

Private Sub Command1_Click() 
WebBrowser1.GoForward 
End Sub 

Private Sub Command2_Click() 
WebBrowser1.GoBack 
End Sub 

Private Sub Form_Load() 
WebBrowser1.Navigate "http://www.applevb.com" 
End Sub 

Private Sub WebBrowser1_CommandStateChange(ByVal Command As Long, ByVal Enable As Boolean) 
If (Command = CSC_NAVIGATEBACK) Then 
Command2.Enabled = Enable 
End If 
If (Command = CSC_NAVIGATEFORWARD) Then 
Command1.Enabled = Enable 
End If 
End Sub

1、如何使网页不出现滚动条:
Private Sub mnuScroll1_Click() 
@#注意:必须在网页完全显示之后才可以运行 
WebBrowser1.Document.body.Scroll = "no" @#不显示滚动条的办法 
End Sub 
Private Sub mnuScroll2_Click() 
@#注意:必须在网页完全显示之后才可以运行 
WebBrowser1.Document.body.Scroll = "Auto" @#显示滚动条的办法 
End Sub

2、如何获得网页中被选中部分的HTML:
Private Sub Command1_Click() 
Dim objSelection 
Dim objTxtRange
Set objSelection = WebBrowser1.Document.selection 
If Not (objSelection Is Nothing) Then 
Set objTxtRange = objSelection.createRange 
If Not (objTxtRange Is Nothing) Then 
Debug.Print objTxtRange.htmlText
Set objTxtRange = Nothing 
End If 
Set objSelection = Nothing 
End If 
End Sub
Private Sub Form_Load() 
WebBrowser1.Navigate "http://www.applevb.com" 
End Sub

使用WebBrowser的Navigator或者Navigator2方法打开一个asp文档并且传递
参数进去,但是asp文档无法获得参数,请教是什么原因?
vb源码: 
Private Sub cmdSubmit_Click() 
Dim strURL As String, strFormData As String 
Dim strData As String 
strURL = Trim$(txtURL.Text) 
strFormData = "name=" & Trim$(txtName.Text) &
"&password=" & Trim$(txtPassword.Text) 
Call WBTest.Navigate2(strURL, 64, "_blank", strFormData,
"hello") 
End Sub
asp源码:
<%@ Language=VBScript %> 
<% 
dim strName 
dim strPassword 
strName=Trim(Request.Form("name")) 
strPassword=Trim(Request.Form("password")) 
Response.Write(strName) 
Response.Write(strPassword) 
if strName="KingZhang" and strPassword="123456" then 
Response.Write("登陆成功") 
else 
Response.Write("非法登陆用户!") 
end if
%>
*********************************************************************
Option Explicit
Private Sub Command1_Click() 
Dim szValue As String 
WebBrowser1.Document.body.innerHTML = "

method=post action=http://地址/xxx.php> 

WebBrowser1.Document.Forms("post").submit 
End Sub
Private Sub Form_Load() 
WebBrowser1.Navigate2 "about:blank" 
End Sub 
Top
============================================================= 
用IE来下载文件 
Private Declare Function DoFileDownload Lib shdocvw.dll (ByVal lpszFile As String) As Long 

Private Sub Command1_Click() 
Dim sDownload As String 
sDownload = StrConv(Text1.Text, vbUnicode) 
Call DoFileDownload(sDownload) 
End Sub 

保存webbrowser中的HTML内容 

Dim oPF As IPersistFile 
Set oPF = WebBrowser1.Document 
oPF.Save "TheFileNameHere.htm", False

WebBrowser1.ExecWB怎么用 

下面是我测试的参数 
WB.ExecWB(4,1) 

4,1 保存网页 
4,2 保存网页(可以重新命名) 
6,1 直接打印 
6,2 直接打印 
7,1 打印预览 
7,2 打印预览 
8,1 选择参数 
8,2 选择参数 
10,1 查看页面属性 
10,2 查看页面属性 
17,1 全选 
17,2 全选 
22,1 重新载入当前页 
22,2 重新载入当前页 
============================================================= 
4.webbrowser确定窗口对话框 

某些网页出于各种考虑会弹出对话框要求信息确认,往往会中断我们的webbrowser过程,可以使用如下方法: 
1.加入Microsoft Html Object 
2.加入语句 

Private Sub WebBrowser1_NavigateComplete2(ByVal pDisp As Object, URL As Variant) 
Dim obj As HTMLDocument 
Set obj = pDisp.Document 
obj.parentWindow.execScript "function showModalDialog(){return;}" '对showModalDialog引起的对话框进行确定 
End Sub 
而confirm引发的对话确定框可用confirm替换showModalDialog即可,Alert等同理~ 
============================================================= 
3.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
============================================================= 
1.防止新窗口用IE打开 
Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)  
Dim frmWB As Form1  
Set frmWB = New Form1  
frmWB.WebBrowser1.RegisterAsBrowser = True  
Set ppDisp = frmWB.WebBrowser1.Object  
frmWB.Visible = True  
End Sub
============================================================= 
2.获得鼠标所到之处的超链接地址!
Private Sub WebBrowser1_StatusTextChange(ByVal Text As String) 
If Left$(LCase(Text), 7) = "http://" Then MsgBox "当前链接:" & Text 
End Sub

=========================下面的貌似是Delphi的========================== 

1.获得网页中变量值 
htm中<script> var currID=123</script> 
程序中可以这么调用 id := Form1.WebBrowser1.OleObject.Document.script.currID 
值得说明的是,变量可以是javascript定义的,也可以是vbscript定义的,如果Webbrowser1中找不到该变量,调用会触发一个异常事件,即变量currID不存在

2.执行网页中的函数 
tmp := 'currID = getNextID(currID)'+#13#10; 
Form1.WebBrowser1.OleObject.Document.parentWindow.execScript(tmp,'JavaScript'); 
调用函数的方法就是execScript接口,同样,如果函数不存在,或者运行错误也会触发脚本错误异常

3.设置网页背景 
背景图片 WebBrowser1.OleObject.Document.body.background     := 'http://seelearn.com/bg.gif' 
背景颜色 WebBrowser1.OleObject.Document.body.bgcolor     := '#eeeeee'

4.调用网页中已知对象 
src := WebBrowser1.OleObject.Document.getElementByID('img1').src 
该方法其实就是javascript中的 getElementByID

5.获取页面中所有的frame 
使用DHTML。 
frames:=wb.OleObject.document.frames; 
for i:=0 to frames.length do 
memo1.lines.Add(frames .document.body.innerHTML); 
6.BorderStyle=bsNone后Webbrowser会被重新初始化 
这是一个让人很意外的一个问题,Delphi在窗口控件的控制方面做得非常好,很少出现这种BUG 
根据分析,出现这个现象有很多情况 改变FormStyle也会出现 ; 如果     webbrowser.parent     由panel1     改到panel2.也会导致webbrowser重新 
初始化。

7.直接向Webbrowser中写入html代码,不需要Navigate到实际存在的文件 
var 
StrStream:TStringStream; 
SetNoteStr: string; 
begin 
SetNoteStr :='<body bgcolor=222222 align=center><br><p align=center><font size=+2 color=#FFFFFF>点点博客 http://seelearn.com</font></p>'; 
SetNoteStr :=SetNoteStr+'<br><p align=center><font size=+2 color=#FFFFFF>点击左边按钮可查看对应图片</font></p>'; 
StrStream:=TStringStream.Create(SetNoteStr); 
WebBrowser1.Navigate('about:blank'); 
try 
StrStream.Position:=0; 
( WebBrowser1.Document as IPersistStreamInit).Load(TStreamadapter.Create(StrStream)); 
finally 
StrStream.Free; 
end; 
end;

8.前进,后退,刷新 
self.WebBrowser1.GoBack 
self.WebBrowser1.GoForward 
self.WebBrowser1.Refresh

9.捕捉NewWindow2事件,即新开窗口事件 
procedure TForm1.WebBrowser1NewWindow2(Sender: TObject; 
var ppDisp: IDispatch; var Cancel: WordBool); 
var 
NewWindow: TForm2; 
begin 
//exit; 
NewWindow:= TForm2.Create(nil); 
NewWindow.Show; 
ppDisp:= NewWindow.Webbrowser1.DefaultDispatch; 
end; 
值得一题的是该方法不能获得新开窗口的URL,退一步的方法只能是等到在新的Webbrowser中触发BeforeNavigate2事件判断了

10.网页中存在iframe时判断页面是否下载结束 
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject; 
const pDisp: IDispatch; var URL: OleVariant); 
begin 
if WebBrowser1.Application = pDisp then showmessage('页面已全部下载完毕') 
end; 
说明一下,每个iframe下载完毕都会触发DocumentComplete事件,所以一个页面在真正下载完毕前可能被触发多次

初始化和终止化(Initialization & Finalization)
大家在执行TWebBrowser的某个方法以进行期望的操作,如ExecWB等的时候可能都碰到过“试图激活未注册的丢失目标”或“OLE对象未注 册”等错误,或者并没有出错但是得不到希望的结果,比如不能将选中的网页内容复制到剪贴板等。以前用它编程的时候,我发现ExecWB有时侯起作用但有时 侯又不行,在Delphi生成的缺省工程主窗口上加入TWebBrowser,运行时并不会出现“OLE对象未注册”的错误。同样是一个偶然的机会,我才 知道OLE对象需要初始化和终止化(懂得的东东实在太少了)。 
Initialization     
OleInitialize(nil);   
finalization     
try      
OleUninitialize;     
except    
end;

去掉滚动条的方法:核心代码:WebBrowser1.oleobject.Document.body.Scroll:= ‘no’; 利用这个代码去掉滚动条的前提是webbrowser中必须有打开的网页,也就是在网页加载完完毕后再去掉滚动条。所以首先要判断页面是否加载完毕,如果 加载完毕,就执行上面的语句去掉滚动条。
第一步:在WebBrowser1DocumentComplete事件中置一个标志tag:=1(代表加载完毕) 代码如下:
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject; 
const 
pDisp: IDispatch; 
var 
URL: OleVariant); 
begin 
tag:=1; //去掉Webbrowser1滚动条的标志 
end;
第二步:
procedure TForm1.SpeedButton1Click(Sender: TObject); 
var 
Doc: IHTMLDocument2; 
begin 
tag := 0; //去掉Webbrowser1滚动条的标志 
WebBrowser1.Navigate2(’http://www.163.com’); 
while (tag=0) do 
Application.ProcessMessages; 
WebBrowser1.oleobject.Document.body.Scroll := ‘no’; 
end;
注意:使用前必须在uses中加入mshtml;
==========================题外话 //去掉滚动条后如何翻页呢?用如下代码
var 
Doc: IHTMLDocument2; 
begin 
Doc :=WebBrowser1.Document as IHTMLDocument2; 
Doc.Get_ParentWindow.Scroll(x,y); 
end;                           ^^^你要滚动的位置 
webbrowser不弹出错误提示框 
设置一下这个属性:webbrowser1.silent :=true
让Webbrowser中的链接点击时在自身窗口打开 
在WebBrowser的NewWindow2事件中设置代码:
procedure TForm1.WebBrowserNewWindow2(Sender: TObject; var ppDisp: IDispatch; 
var Cancel: WordBool); 
begin     // 將新視窗在自身開啟 
ppdisp := webBrowser.Application; 
end;

屏蔽WebBrower的右键菜单
放一个ApplicationEvents控件,在ApplicationEvents的事件OnMessage中设置如下代码: (ApplicationEvents控件在delphi中的additional选项卡上找)
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;   var Handled: Boolean); 
begin      //屏敝网页右键 
if Msg.message = WM_RBUTTONDOWN then 
begin 
//如果去掉下面这行就是屏蔽右键菜单,现在为自定义右键菜单 // 
popupmenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); 
Handled := True; 
end; 

end; 


文章来自:http://hi.baidu.com/broland/blog/item/3337ad987285111c6e068cca.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值