WebBrowser之功用

2023-11-03 11:08
文章标签 webbrowser 功用

本文主要是介绍WebBrowser之功用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这么多篇关于WebBrowser之后,来一篇关于它的全面点的介绍

转自http://blog.sina.com.cn/s/blog_3d7bed6501000c8n.html

 

WebBrowser控件简介
WebBrowser控件由来以久,是一个ActiveX控件。以前可以通过COM引用并使用。但在.Net Framework 2.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
{
    private SHDocVw.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 控件时的注意事项
 
1、在NET 2.0下的Webbrowser控件是对Webbrowser COM组件的不完全封装。所以,在简便的同时也会出现这样或那样的问题。简便也是有代价的。
2、WebBrowser控件异步浏览到文档。在调用Navigate()时,该调用会在文档完全加载之前将控制权返回给应用程序。如果打算为所包含的文档实现自动操作,则必须在DocumentCompleted事件在文档完成加载后发出通知。或是通过IsBusy来判断当前WebBrowser是否正忙于加载其他文档。
    然而,通过实践,问题却不是这么简单。一般情况下,当ReadyState属性变成READYSTATE_COMPLETE时,Webbrowser控件会通过触发DocumentCompleted事件来指示网页加载完毕。但当加载的网页包含frame时,可能会多次触发该事件,所以不能简单地通过它来判断网页加载完毕。并非每个frame都对应了一个DocumentCompleted事件,只有触发了DownloadBegin事件的frame才会有相应的DocumentCompleted事件。另外,最外层的frame总是最后触发DocumentCompleted事件。那么怎么准确的判断页面加载完毕了呢,以下为一方案:

    int counter =  0 ; // 计数器
    private void webBrowser_Navigated(object sender, 

               WebBrowserNavigatedEventArgs e){
        counter ++ ;
    }
    private void webBrowser_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之功用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/337745

相关文章

delphi操作webbrowser htmldocument,操作web界面

原文地址:https://www.cnblogs.com/endv/p/5983110.html   {IHTMLDocument2 方法:}write //写入writeln //写入并换行open //打开一个流,以收集 document.write 或 document.writeln 的

VC++ webbrowser函数使用范例

[cpp]  view plain copy print ? /*============================说明部分=================================    实现一下函数需包含头文件   #include <Wininet.h>   #include <Shlwapi.h>   Linker : Wininet.lib  Shlw

Linux系统主要目录的功用

/var某些大文件的溢出区,比方说各种服务的日志文件/lost+found这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里/proc虚拟的目录,是系统内存的映射。可直接访问这个目录来获取系统信息/mnt系统提供这个目录是让用户临时挂载其他的文件系统/root系统管理员的主目录(呵呵,特权阶级)/tmp公用的临时文件存储点/sbin系统管理命令,这

EcoVadis功用上注册指南,如何注册EcOVadis官网账户?

以下内容均来自EcoVadis官方网站,仅供参考: 为什么供应商必须注册? 注册目的: . -定义负责贵司公司的企业社会责任审核最适当的联系人。 -创建符合贵公司情况的企业社会责任问卷。 -供应商需要提供的相关信息:商业活动,规模,所属行业,所在国家等等。这些信息将用于设计问卷,因此十分重要。 -如果贵公司已经参与过EcoVadis审核,您同样需要完成注册以确认新客户要求的审核范围。

WPF WebBrowser控件解析 HTML

WPF WebBrowser控件解析 HTML <WebBrowser x:Name="webBrowser" /> public void InitWeb(){string htmlString = @"<html><head><title>this is a test</title><script type ='text/javascript'>function Hello(){wi

C# Winform WebBrowser获取Html界面中js变量方法总结

如界面中有一个变量appVersion=“xiaomi”; 需要获取变量appVersion的值,有以下方法: 1.插入一个函数,此函数返回 token变量,注意需要判断token是否存在,否则会报错,示例代码如下:   webBrowser1.Navigate(new Uri("http://www.baidu.com"));    var doc = webBrowser1.Docum

在winform里怎么调用WebBrowser控件里的脚本(转载)

这是在CSDN论坛上的一个问题,感觉也许对其他人也会有点用处,所以贴出来 JScript是建立在COM之上的,设置变量/调用函数是通过IDispatch来实现的。在.NET里,调用IDispatch里的方法是通过反射来实现的,即,通过System.Type.InvokeMember 。该方法调用 IDispatch::GetIDsOfNames 以及IDispatch::Invoke来调用

WebBrowser控件 导航

VARIANT vURL;VARIANT vNull;// InitVariantInit(&vURL);VariantInit(&vNull);// Set valuevNull.vt = VT_BSTR;vNull.bstrVal = NULL;vURL.vt = VT_BSTR;vURL.bstrVal = SysAllocString("http://www.test.com/"

MFC的WebBrowser控件 C++与JavaScript之间数据交互传递

-----------------------------------------------------------------------------------------------------------------------------------------------      最近开发MFC程序,用WebBrowser控件调用百度地图JavaScript API来展示轨迹,

MFC中WebBrowser.Navigate方法如何调用本地的.htm文件?

-------------------------------------------------------------------------------------------------------------------------------------------      最近开发MFC程序,需要使用WebBrowser控件来调用百度地图API,前端代码写在htm文件中,为了方