61阅读

webbrowser-webBrowser用法小结

发布时间:2017-10-05 所属栏目:delphi webbrowser

一 : webBrowser用法小结

   最近在使用webBrowser时,遇到了一些繁琐的问题,虽然最终大部分都解决了,但还是消耗了一段时间。[www.61k.com]在此将遇到的问题记录下来。

1.问题:点击链接的时候,弹出新IE窗体。

解决方法:原本使用webBrowser就是为了想在客户端程序里面显示网页,可是一点击连接就跳出新窗体无疑让人相当头痛。还好,大部分情况下,通过其自带的webBrowser1.NewWindow事件就可以解决。

private void webBrowser1_NewWindow(object sender, CancelEventArgs e)  {  e.Cancel = true;  webBrowser1.Navigate(webBrowser1.StatusText);  }

e.Cancel=true,是指将打开新窗体的事件取消,而下一句就是使webBrowser控件跳转到原来会打开的新地址。但是,有时候这种方法会无效。我遇到的情况是,页面是通过post数据到另一页面这种形式,在这种情况下,上面的事件就不够用了。下面解释一下另一种用法。

我的思路是,其post的数据是关键,只要获取到要传递的数据,在将这个传递的事件取消,由我们自己来跳转。这一过程在webBrowser控件里面是没有对应事件的。还好,微软提供了另一组接口。

首先,引用shdocvw.dll,这个dll可以在C:\WINDOWS\system32下找到。

而后,实例化这个接口,来获得更多的事件

private SHDocVw.WebBrowser SHWebBrowser;  SHWebBrowser=(SHDocVw.WebBrowser)webBrowser1.ActiveXInstance;  SHWebBrowser.NewWindow2 += new DWebBrowserEvents2_NewWindow2EventHandler(SHWebBrowser_NewWindow2);  SHWebBrowser.BeforeNavigate2 += new DWebBrowserEvents2_BeforeNavigate2EventHandler(SHWebBrowser_BeforeNavigate2);

这里就用的到的就这两个事件,其他详细的事件描述,可以参照这个链接如何对webbrowser和IE编程。首先就是避免新窗体,NewWindows事件

private void SHWebBrowser_NewWindow2(ref object o, ref bool cancel)  {  webBrowser1.Navigate(webBrowser1.StatusText);  cancel = true;  }

里面必须有webBrowser1.Navigate(webBrowser1.StatusText)这个语句,这是为了触发BeforeNavigate事件,因为BeforeNavigate会发生在每一个导航中。而后,就是获取post的数据了

private void SHWebBrowser_BeforeNavigate2(object pDisp, ref object URL, ref object Flags, ref object TargetFrameName, ref object PostData, ref object Headers, ref bool Cancel)  {  string strpostData = System.Text.Encoding.ASCII.GetString(PostData as byte[]);//关键,将上传的POST截取  }

这样,我们就可以获取post的数据来进行下一步的操作了。

2.问题:如何获取webBrowser里面按键的情况,就是指,焦点在网页时,获取键盘的按钮情况。

这个是通过一个PreviewKeyDown事件来实现的,事件是这种形式webBrowser1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e),只需要获取e.KeyValue的值就可以了,遇到的问题在于,这个事件会触发两次。查询了很多相关资料都没有发现原因,后来只能归咎于微软的一个bug吧。目前的解决方案是通过设置一个bool参数。来判断是否是第一次加载。

3.程序安装的时候出现未能注册模块(程序路径)\ieframe.dll提示

这种情况的出现,是因为上面引用的shdocvw.dll,目前发现了一个折中的解决方法,在安装程序里面,可以看到ieframe.dll的一个引用,右击选择排除。这样安装的时候就不会出现这种提示。只要安装的目标机子上又ie6或者ie7,程序就不会有任何问题,考虑到这时winform开发,一般情况下,这种方法可行。

二 : webbrowser介绍

该组件是一个浏览器组件,可以显示一个指定地址的网页、设置网页打开时的主页以及对网页进行相关的操作,同时也可以对HTML文件进行剪切、复制、粘贴、删除等操作。该组件在Internet组件页中。
1.属性
(1)AddressBar属性
设置是否显示地址栏,在TWebBrowser中没有用。
语法:
propertyAddressBar:WordBool;
(2)Busy属性
确定Web浏览器组件是否正在导航到一个新的URL地址或正在下载文档。
语法:
propertyBusy:WordBool;
示例:
如果该属性值为True,则在开始一个新的操作前,可用Stop方法中止当前操作,然后再导航到其他的页面,代码如下:
procedureTForm1.BitBtn1Click(Sender:TObject);
begin
ifWebBrowser1.Busythen
WebBrowser1.Stop;
WebBrowser1.Navigate('www.mingrisoft.com');
end;
(3)Container属性
访问Web浏(www.61k.com)览器父类或容器的接口。
语法:
propertyContainer:IDispatch;
示例:
如果Web浏览器没有一个具有Automation接口的容器,则该属性的值为空。否则可以通过返回的接口,访问Web浏览器父类或容器,代码如下:
ifWebBrowser1.Container<>nilthen
begin
WebBrowser1.Stop;
end
else
ShowMessage('Web浏览器没有一个具有Automation接口的容器');
(4)ControlInterface属性
访问WebBrowser组件接口,这个接口允许一个Automation控制器访问Web浏览器的属性、方法和事件。
语法:
propertyControlInterface:IWebBrowser2;
示例:
显示WebBrowser1组件的名称,代码如下:
Showmessage(WebBrowser1.ControlInterface.Name);
(5)FullName属性
指定主机上Web浏览器组件的可执行文件的完整的合法路径名。
语法:
propertyFullName:WideString;
示例:
显示Web浏览器组件所在的可执行文件的名称,并且包含路径,代码如下:
ShowMessage('Web组件所在的可执行文件为:'+WebBrowser1.FullName);
(6)LocationName属性
获得当前在Web浏览器组件中显示的资源名。
语法:
propertyLocationName:WideString;
示例:
显示网页标题的名称,代码如下:
ShowMessage('网页标题名:'+WebBrowser1.LocationName);
(7)LocationURL属性
确定当前显示文档、文件夹的URL或路径。
语法:
propertyLocationURL:WideString;
示例:
显示地址的完整路径,代码如下:
ShowMessage('Web浏览器组件连接的URL为:'+WebBrowser1.LocationURL);
(8)Name属性
指定计算机上的TWebBrowser的名称。
语法:
propertyName:WideString;
(9)Offline属性
指定Web浏览器是否从本地缓存中获取文档。该属性为True时,表示Web浏览器以脱机方式工作,否则为在线方式。
语法:
propertyOffline:WordBool;
注意:可以使用IE浏览器保存HTML网页到本地缓存,浏览器可以脱机方式工作。
(10)Path属性
指定主机上Web浏览器组件可执行文件的路径名,不包括文件名。
语法:
propertyPath:WideString;
示例:
Str:=WebBrowser1.Path;
(11)ReadyState属性
获得指定Web浏览器组件的状态信息,使用这个信息可避免Web浏览器执行未准备的操作。
语法:
propertyReadyState:TOleEnum;
(12)RegisterAsBrowser属性
设置该属性为True时,当前使用的Web浏览器组件成为最高级别浏览器。
语法:
propertyRegisterAsBrowser:WordBool;
(13)RegisterAsDropTarget属性
指出是否允许用户拖放HTML文档到当前Web浏览器。
语法:
propertyRegisterAsDropTarget:WordBool;
示例:
该属性为True时,允许用户拖放HTML文档到当前Web浏览器;否则拖放操作无效,代码如下:
procedureTForm1.ToolButton4Click(Sender:TObject);
begin
ifnotWebBrowser1.RegisterAsDropTargetthen
WebBrowser1.RegisterAsDropTarget:=true;
end;
(14)Silent属性
指定TWebBrowser是否显示对话框。该属性为True时,该对话框不再显示脚本错误。
语法:
propertySilent:WordBool;
(15)Type_属性
指定包含的文档对象的类型名称,读取该属性以确定Automation对象的类型,该对象的接口通过Document属性表示。
语法:
propertyType_:WideString;
示例:
显示文件的类型,代码如下:
ShowMessage('Automation对象的类型为:'+WebBrowser1.Type_);
2.方法
(1)ClientToWindow方法
IE使用该方法转换客户坐标与窗口坐标。一般不要使用该方法。
语法:
procedureClientToWindow(varpcx:SYSINT;varpcy:SYSINT);
pcx:坐标点X。
pcy:坐标点Y。
(2)ExecWB方法
允许用户用IOleCommandTarget接口传递一个命令到当前Web浏览器组件。Microsoft定义了一些常量来表示这些命令,但是Web浏览器不全部支持这些命令,可用QueryStatusWB方法使用这些命令。
语法:
procedureExecWB(cmdID:OLECMDID;cmdexecopt:OLECMDEXECOPT);overload;
procedureExecWB(cmdID:OLECMDID;cmdexecopt:OLECMDEXECOPT;varpvaIn:OleVariant);
overload;
procedureExecWB(cmdID:OLECMDID;cmdexecopt:OLECMDEXECOPT;varpvaIn:OleVariant;
varpvaOut:OleVariant);overload;
示例:
调用ExecWB方法能够完成许多功能,例如停止网页浏览,代码如下:
WebBrowser1.ExecWB(OLECMDID_STOP,OLECMDEXECOPT_PROMPTUSER);
(3)GoBack方法
返回到历史列表中的上一个文档。如果历史列表中没有包含另外的文档,该方法将无效。
语法:
procedureGoBack;
示例:
返回当前页的上一页,代码如下:
WebBrowser1.GoBack();
(4)GoForward方法
返回到历史列表中的下一个文档,与最后调用GoBack方法的效果相反。
语法:
procedureGoForward;
示例:
返回当前页的下一页,但是如果历史列表中没有下一个文档,则产生异常,代码如下:
try
WebBrowser1.GoForward();
except
exit;
end;
(5)GoHome方法
返回已注册主页或开始页,在注册表中指定主页的注册项为:HKEY_CURRENT_USER\Sof-tware\Microsoft\IE\Main下的SStartpage名称栏。可用TRegistry、TRegistryIniFile对象或IE浏览器“工具”中的Internet选项改变注册主页。
语法:
procedureGoHome;
示例:
返回主页,代码如下:
ifWebBrowser1.Busythen
WebBrowser1.Stop;
WebBrowser1.GoHome;
(6)GoSearch方法
打开已注册的搜索网页,在注册表中指定搜索网页的注册项为:HKEY_CURRENT_USER\Sof-ware\Microsoft\IE\Main下的SearchPage名称栏。可用TRegistry、TRegistryIniFile对象或IE浏览器中“工具”中的Internet选项改变注册搜索网页。
语法:
procedureGoSearch;
示例:
打开已注册的搜索网页,代码如下:
ifWebBrowser1.Busythen
WebBrowser1.Stop;
WebBrowser1.GoSearch();
(7)Navigate方法
定位或下载指定的资源,发送HTTP消息到指定的URL并显示指定文件的内容,也可用来显示指定的文件。
语法:
procedureNavigate(constURL:WideString);overload;
procedureNavigate(constURL:WideString;varFlags:OleVariant);overload;
procedureNavigate(constURL:WideString;varFlags:OleVariant;varTargetFrameName:
OleVariant);overload;
procedureNavigate(constURL:WideString;varFlags:OleVariant;varTargetFrameName:
OleVariant;varPostData:OleVariant);overload;
procedureNavigate(constURL:WideString;varFlags:OleVariant;varTargetFrameName:
OleVariant;varPostData:OleVariant;varHeaders:OleVariant);overload;
Navigate方法语法中各参数的说明如表26.14所示。
示例:
Navigate方法是TWebBrowser组件中最重要的方法之一,使用该方法能够将当前TWebBrowser组件导航到任何存在的链接上,代码如下:
ifWebBrowser1.Busythen
WebBrowser1.Stop;
WebBrowser1.Navigate(URL);//URL为网址
(8)Navigate2方法
定位或下载指定的资源,发送HTTP消息到指定的URL并显示指定文件的内容,或导航到不能表达为URL的资源。
语法:
procedureNavigate2(varURL:OleVariant);overload;
procedureNavigate2(varURL:OleVariant;varFlags:OleVariant);overload;
procedureNavigate2(varURL:OleVariant;varFlags:OleVariant;varTargetFrameName:
OleVariant);Overload;
procedureNavigate2(varURL:OleVariant;varFlags:OleVariant;varTargetFrameName:
OleVariant;varPostData:OleVariant);overload;
procedureNavigate2(varURL:OleVariant;varFlags:OleVariant;varTargetFrameName:
OleVariant;varPostData:OleVariant;varHeaders:OleVariant);overload;
示例:
Navigate2方法与Navegate方法类似,能够将当前TWebBrowser组件导航到指定的资源,代码如下:
procedureTForm1.GoUrl2(URL:String);//URL为指定的资源的网址
var
oUrl:Olevariant;
oPost,oFram,oflag:Olevariant;
begin
oUrl:=Url;
oFram:=0;
oFlag:=navOpenInNewWindow;//在新窗口中打开资源
oPost:='';
ifWebBrowser1.Busythen
WebBrowser1.Stop;
WebBrowser1.Navigate2(oUrl,oFlag,oFram,oPost);
end;
(9)QueryStatusWB方法
确定可以使用ExecWB方法执行的命令,即Web浏览器支持的命令信息,该方法使用IOleCommandTarget接口的QueryStatus方法来得到命令状态的信息。
语法:
functionQueryStatusWB(cmdID:OLECMDID):OLECMDF;
cmdID:指定要获取其信息的命令。
(10)Refresh方法
重新载入当前文档。Web浏览器正在显示的URL指定的资源可能已经发生变化时,这个方法非常有用。该方法总是发送一个参数,即非缓存标题,通知服务器不要返回缓存的复制,这对于某些服务器可能是一个问题。为阻止发送这个非缓存标题参数或只是刷新过期的网页,可用Refresh2方法。
语法:
procedureRefresh;
示例:
该方法完成了IE浏览器的刷新功能,可以使用该方法来重新载入当前页面,如果当前TWebBrowser组件没有载入任何的网页,则会产生异常,代码如下:
ifWebBrowser1.LocationURL<>''then
WebBrowser1.Refresh;
(11)Refresh2方法
调用Refresh2方法重新装入当前文档,与Refresh方法不同的是,该方法可指定要完成的刷新级别。
语法:
procedureRefresh2;overload;
procedureRefresh2(varLevel:OleVariant);overload;
Level:指定要被刷新信息的类型,其取值如表7所示。
示例:
Refresh2方法提供了更加复杂的刷新方式,提供了多种刷新方法,通过该方法同样能够实现Refresh方法完成的任务,代码如下:
procedureTForm1.ToolButton7Click(Sender:TObject);
var
Level:Olevariant;
begin
Level:=REFRESH_IFEXPIRED;
ifWebBrowser1.LocationURL<>''then
WebBrowser1.Refresh2(Level);
end;
(12)Stop方法
终止任何未完成的导航或下载操作,并终止任何动态的网页元素,如背景音乐和动画等。
语法:
procedureStop;
示例:
该方法实现了IE中的停止功能,即停止了一切载入工作,代码如下:
WebBrowser1.Stop;
3.事件
(1)OnBeforeNavigate2事件
Web浏览器导航到一个新的资源前被触发。
语法:
propertyOnBeforeNavigate2:TWebBrowserBeforeNavigate2;
typeTWebBrowserBeforeNavigate2=procedure(Sender:TObject;constpDisp:IDispatch;varURL:OleVariant;varFlags:OleVariant;varTargetFrameName:OleVariant;varPostData:OleVariant;varHeaders:OleVariant;varCancel:WordBool)ofobject;
(2)OnCommandStateChange事件
当执行TWebBrowser组件的某个方法的功能改变时被触发,其状态取值决定于执行Web浏览器中某个方法的功能。
语法:
propertyOnCommandStateChange:TWebBrowserCommandStateChange;
typeTWebBrowserCommandStateChange=procedure(Sender:TObject;Command:Integer;Enable:WordBool)ofobject;
Sender:指出其功能已变化的Web浏览器组件。
Enable:指定CSC_NAVIGATEFORWARD或CSC_NAVIGATEBACK命令是否可用,其值为True时,可用;否则不可用。
示例:
OnCommandStateChange事件提供了一个命令状态改变后的处理功能,通过该事件能够判断执行某个命令后的当前浏览器状态,例如控制“后退”、“前进”或“停止”按钮是否可用,代码如下:
procedureTForm1.WebBrowser1CommandStateChange(Sender:TObject;
Command:Integer;Enable:WordBool);
begin
caseCommandof
CSC_NAVIGATEBACK:ToolButton5.Enabled:=Enable;//“后退”按钮
CSC_NAVIGATEFORWARD:ToolButton4.Enabled:=Enable;//“前进”按钮
CSC_UPDATECO美眉ANDS:ToolButton2.Enabled:=TWebBrowser(Sender).Busy;//“停止”按钮
end;
end;
(3)OnDownloadBegin事件
Web浏览器开始下载一个文档时被触发,编写其事件处理程序可以指定Web浏览器定位到一个文档后下载该文档前应采取的操作。
语法:
propertyOnDownloadBegin:TNotifyEvent;
typeTNotifyEvent=procedure(Sender:TObject)ofobject;
(4)OnDownloadComplete事件
导航操作完成、暂停或操作失败时被触发,编写其事件处理程序可以指定应采取的操作。
语法:
propertyOnDownloadComplete:TNotifyEvent;
typeTNotifyEvent=procedure(Sender:TObject)ofobject;
(5)OnNavigateComplete2事件
当Web浏览器成功地导航到一个新的位置时被触发,编写其事件处理程序可以指定应执行的操作。这个事件可能产生在当前文档下载完成前,但是事件结束时,至少已经接收到部分文档并产生了文档视图。
语法:
propertyOnNavigateComplete2:TWebBrowserNavigateComplete2;
typeTWebBrowserNavigateComplete2=procedure(Sender:TObject;constpDisp:
IDispatch;varURL:OleVariant)ofobject;
Sender:导航到新的资源的Web浏览器。
pDisp:浏览器的Automation接口。
示例:
当TWebBrowser组件成功地导航到一个新的位置后触发该事件,利用该事件能够获得当前状态或URL地址,代码如下:
ifWebBrowser1.Offlinethen
Statusbar1.Panels[Statusbar1.Panels.Count-1].Text:='脱机';
else
Statusbar1.Panels[Statusbar1.Panels.Count-1].Text:='在线';
ComboBox1.Text:=WebBrowser1.LocationURL;
(6)OnProgressChange事件
当更新下载操作的进度时被触发,编写其事件处理程序可以提供一个关于下载进度的可视化的反馈。
语法:
propertyOnProgressChange:TWebBrowserProgressChange;
typeTWebBrowserProgressChange=procedure(Sender:TObject;Progress:Integer;
ProgressMax:Integer)ofobject;
Sender:正在下载文档处理进程中的Web浏览器。
Progress:指出有多少文档已经下载,取值范围在0~ProgressMax之间。当其参数为&#8722;1时,操作结束。
PropressMax:指示下载操作的最大值。
示例:
利用该事件能够设计一个准确的网页载入进度条,该进度条表示了当前网页的载入进度,代码如下:
procedureTForm1.WebBrowser1ProgressChange(Sender:TObject;Progress,
ProgressMax:Integer);
begin
ProgressBar1.Max:=ProgressMax;
ifProgress=-1then
ProgressBar1.Visible:=false
else
begin
ProgressBar1.Position:=Progress;
ProgressBar1.Visible:=True;
end;
ifProgressBar1.Position=ProgressMaxthen
ProgressBar1.Visible:=False;
end;

三 : WebBrowser之功用

文 / 喝口水就走
WebBrowser控件简介WebBrowser控件由来以久,是一个ActiveX控件。以前可以通过COM引用并使用。但在.Net Framework2.0以后,提供了WebBrowser控件的托管包装。托管包装使得在Windows窗体客户端中显示网页更为简便。使用WebBrowser控件,可以模仿IE的功能进行Web访问,但不仅仅局限于此,还可以通过禁用默认的IE功能,从而将该控件用作简单的HTML文档查看器,甚至可以浏览Office各种格式文档。此外,WebBrowser支持DOM和文本两种方式修改其承载的内容。这一点意味着没有必要再把修改的HTML保存到临时文件,而是直接在内容中实现修改并显示,提高性能并节省临时文件资源消耗。总而言之,我们可以通过种种方法,到达将Web控件和Windows窗体控件无缝地整合到一个应用程序中的目的。利用WebBrowser浏览网页浏览网页是WebBrowser的老本行,托管包装后的WebBrowser更加简便易用。主要几个方法如下:Navigate(): 导航页面。与以前版本不同,可以只给定一个参数即可,即URI。GoBack() / GoForward() /GoHome():向后/向前/回首页。Stop():Refresh(): 停止加载/刷新以上几个主要方法是用于导航各个页面用的,但它们并不是永远生效。这些方法是否生效,取决于AllowNavigation属性,默认为true,允许导航。Print():用于打印。(1)WebBrowser中的Html文档模型我们可以通过DOM或文本的形式返回当前WebBrowser中的HTML文档:Document: DOM(文档对象模型)形式的对当前网页的HTML描述。DocumentText: 文本形式的对当前网页的HTML描述。DocumentStream: 流形式的HTML描述。关于文本形式的没有什么好说的,它是最直接的HTML描述,但是难于动态修改,而相比之下DOM形式的HTML描述则灵活的多,可以任意添加、修改、删除任意节点。DOM对象模型主要元素有HtmlDocument,HtmlElement, HtmlNode, HtmlText等等,在此不再啰嗦了。(2)WebBrowser与IE默认情况下,WebBrowser控件功能于IE极其相似,提供基本功能。如:可以通过GoHome(),GoBack(),GoFoward(),Stop(),Refresh()来实现IE工具栏中的主页、向后、向前、停止、刷新;通过Navigate()来实现IE中的地址栏;通过设置IsWebBrowserContextMenuEnabled= true来实现IE右键菜单;通过设置WebBrowserShortcutsEnabled =true来实现IE的快捷键等等。同样在某些特殊需要下,我们可能不希望WebBrowser的行为与IE一样,比如我们只是希望WebBrowser作为一个Html的显示器,在这种情况下可把AllowNavigate设置成false来阻止WebBrowser的导航功能;把IsWebBrowserContextMenuEnabled和WebBrowserShortcutsEnabled设置为false来阻止右键菜单和快捷键等等。从而阻止了WebBrowser的一些IE特性。(3)WebBrowser中的脚本错误处理当IE浏览器遇到时脚本错误,左下角会出现一个黄色图标,点击可以查看脚本错误的详细信息,并不会有弹出的错误信息框。但是WebBrowser控件则没有这么聪明,它会弹出错误信息框,使得程序显的很不友好,而且会让一些自动执行的程序暂停。虽然WebBrowser提供了ScriptErrorsSuppressed属性,经过尝试,结果是令人遗憾的,通过设置该属性可以解决部分问题,但不能彻底解决。在此探讨两种解决方案:一是通过截获WebBrowser.Document.Window.Error事件,并阻止WebBrowser继续处理错误来解决。如下://注册捕获控件的错误的处理事件
this.WebBrowser.Document.Window.Error +=new HtmlElementErrorEventHandler(Window_Error);
//对错误进行处理
void Window_Error(object sender, HtmlElementErrorEventArgs e)
{
e.Handled= true; //阻止其他地方继续处理
}
上面的方法可以解决大部分问题,但对于多个框架嵌套等等的情形还是不能很好的解决,于是只能自己动手封装一个MyWebBrowser了,然后用我们自己的MyWebBrowser来替代WebBrowser。如下:

public class MyWebBrowser: System.Windows.Forms.WebBrowser
{
privateSHDocVw.IWebBrowser2 Iwb2;

protected override void AttachInterfaces(object nativeActiveXObject)
{
Iwb2 = (SHDocVw.IWebBrowser2) nativeActiveXObject;
Iwb2.Silent = true;
base.AttachInterfaces(nativeActiveXObject);
}

protected override void DetachInterfaces()
{
Iwb2 = null;
base.DetachInterfaces();
}
}

这种方法能能很好的解决问题,其实使用过非托管WebBrowser的朋友肯定看出来了,实际上是通过引用SHDocVw绕过托管代码,直接SHDocVw.IWebBrowser2.Silent= true,最原始的也是最有效的。

利用WebBrowser访问Office文件刚刚说过浏览网页是WebBrowser的老本行,那么除了本行外,其实他还可以搞点兼职。我们知道,在.Net窗体中是不提供嵌入Office文档OLE控件的,如果希望嵌Office文档的话,一个可能的解决方案就是使用WebBrowser控件。其实在IE中就可以嵌入Office文档,所以WebBrowser具有此功力也很正常,但它带来的效果确实不错。操作也很简单:this.webBrowser1.Navigate(strFileName);只此一句,WebBrowser就会以嵌入的形式打开Office文档(Word, Excel,PowerPoint,...)了,效果如下图:WebBrowser之功用WebBrowser之功用使用 WebBrowser控件时的注意事项1、在NET 2.0下的Webbrowser控件是对WebbrowserCOM组件的不完全封装。所以,在简便的同时也会出现这样或那样的问题。简便也是有代价的。2、WebBrowser控件异步浏览到文档。在调用Navigate()时,该调用会在文档完全加载之前将控制权返回给应用程序。如果打算为所包含的文档实现自动操作,则必须在DocumentCompleted事件在文档完成加载后发出通知。或是通过IsBusy来判断当前WebBrowser是否正忙于加载其他文档。然而,通过实践,问题却不是这么简单。一般情况下,当ReadyState属性变成READYSTATE_COMPLETE时,Webbrowser控件会通过触发DocumentCompleted事件来指示网页加载完毕。但当加载的网页包含frame时,可能会多次触发该事件,所以不能简单地通过它来判断网页加载完毕。并非每个frame都对应了一个DocumentCompleted事件,只有触发了DownloadBegin事件的frame才会有相应的DocumentCompleted事件。另外,最外层的frame总是最后触发DocumentCompleted事件。那么怎么准确的判断页面加载完毕了呢,以下为一方案:

intcounter = 0 ; // 计数器
private voidwebBrowser_Navigated(objectsender,

WebBrowserNavigatedEventArgs e){
counter ++ ;
}
private voidwebBrowser_DocumentCompleted(object sender,

WebBrowserDocumentCompletedEventArgs e){
counter -- ;

if (counter == 0){
// 加载完毕
}
}

3、在一个项目中有多个WebBrowser控件并且每个控件都加载相同类型的Office文档(全都是Word或全都是Excel)时,会出现多种问题。最常见的问题发生在Office命令栏上(命令栏会被禁用)。如果在同一个窗体上有两个WebBrowser控件,且两个控件都加载Word文档,那么只有一组工具栏会是活动的,另外一个则被禁用,无法使用。所以,建议一个项目只使用一个控件,并且一次只浏览到一个文档。


4、要清除WebBrowser控件中的当前内容,使用下面的代码浏览到默认空白页:
this.webBrowser1.Navigate("about:blank");

参考文章

WebBrowser脚本错误的完美解决方案

如何使用WebBrowser控件在.NET中打开Office文档

Webbrowser控件判断网页加载完毕的简单方法

本文标题:webbrowser-webBrowser用法小结
本文地址: http://www.61k.com/1077720.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1