原文:C#中WebBrowser的使用

  其实网络上这类文章很多,我大致从头说说我自己的经验。

1、加入引用

  在控件栏按右键,选择“添加/移除项”,选COM组件,选中“Microsoft Web Browser”。然后就可以往窗体上拖出一个该控件(下面把该控件一个对象称为webBrowser)。控件属性中可以调整的不多,从一些资料中得知WebBrowser中的MenuBar、StatusBar等其实都没实现。

(注: .Net 2.0已经专门封装了一个控件,不需要添加COM组件了。)

2、控件的函数

  由于是COM过来的控件,它的一些函数就比较怪,基本的Navigate函数除了第一个参数外,其它都是ref类型的,需要显式地写ref才能调用。一般要使之导向到某个页面,先设置一个空对象,object objNull=null;然后

webBrowser.Navigate(strPage, ref objNull, ref objNull, ref objNull, ref objNull);

即可。具体其它四个参数可参考相关文档。

  还有一个常用的功能,就是怎么让浏览器显示自己的html文档,一个方法是用DOM里根元素的innerText:

  ((mshtml.HTMLDocumentClass)webBrowser.Document).documentElement.innerText=sHTML;

(注: 以上是.Net 1.1下的代码)

  相当用于Javascript设置网页的代码。这种方法方便是方便,但是有很多问题,写入的大部分Javascript函数都没法正常使用,即使用<script defer>似乎也没用;这样不能用前进、后退来进行历史浏览;查看源代码根本看不到什么……其实最致命的就是 Javascript没法用,无法满足一般的需要。

  第二个方法是把自己的网页写到一个临时文件,然后navigate到这个文件,Foxmail是这样做的。这样做的缺点是会产生很多临时文件,文件在磁盘上的读写需要耗费较多时间,而且要记得及时清理。

  第三个方法是用COM中IPersistStreamInit之类的,使用流操作,据说Outlook便是这样做的。这样显然是最好的,在内存中形成网页进行操作速度也很快。但我在.Net里找不到这个接口,所以不知道如何实现。



3、与应用程序交互

  网页与应用程序的交互不外乎是网页上点击某链接,或通过其它途径,比如表单提交等,使浏览器导航至新的链接,所以我通过BeforeNavigate2这个事件来,该事件有flags、headers、postData、targetFrameName、uRL等属性,足够我们进行处理。这样我们程序就好像一个WebServer,可以处理网页上的链接、提交的表单等等。然后把使浏览器导航至处理后产生的结果网页。

  又在网上看到有人用System.Runtime.InteropServices.Expando.IExpando:

  mshtml.HTMLDocumentClass doc2=(mshtml.HTMLDocumentClass)webBrowser.Document;

  System.Runtime.InteropServices.Expando.IExpando ex=(System.Runtime.InteropServices.Expando.IExpando)doc2;

  System.Reflection.PropertyInfo piform1=ex.AddProperty("Form1");

  piform1.SetValue(doc2,this,null);

  这样,在网页中的document.Form1就是这个WinForm的Control了。你可以用脚本来调用Form1!这也不失为一个极妙的方法。



4、应用程序操作浏览器/网页:

  WebBrowser浏览器控件提供了一些函数,如ExecWB,可以使浏览器执行内部定义的一些操作,如执行另存为:

  webBrowser.ExecWB( SHDocVw.OLECMDID.OLECMDID_SAVEAS, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT, ref objNull, ref objNull );

  但似乎这里按取消的话会抛出一个异常,所以我用一个空的try{}catch(Exception){}来捕获它,就不会有错误了。

  还可以用DOM里的一些方法来操作网页,举个例子,可以这样调用网页中写好的一个Javascript函数func():

  ((mshtml.HTMLDocumentClass)webBrowser.Document).parentWindow.execScript( "func()", "JScript" );

(注: 同样是.Net 1.1的代码)

暂时就这样,比较常用的也就是这些了。其它的就让我们在继续使用中慢慢琢磨体会吧。

(注: 发现这篇文章被很多地方转录了,说明一下,只适用于.Net 1.1)

C#中WebBrowser的使用的更多相关文章

  1. C#中WebBrowser控件的使用

    今天在YouTube上看了一个关于WebBrowser控件用法的小视频,做一下总结. 首先创建一个WinForm程序,拖入一个textbox控件和一个button按钮,然后拖入一个panel控件,如图 ...

  2. 通过批处理操作注册表实现winform应用中Webbrowser以指定的IE版本加载网页

    通过批处理操作注册表实现winform应用中Webbrowser以指定的IE版本加载网页 rem 强制WebBrowser控件使用指定IE版本显示应用的网页 IF EXIST %windir%\Sys ...

  3. Delphi中WebBrowser控件打开部分网站报"Invalid floating point operation”解决

    Delphi中WebBrowser控件打开部分网站报"Invalid floating point operation”解决 EmbeddedWBWebBrowserDelphi  最近用E ...

  4. delphi中webbrowser的用法

    WebBrowser1.GoHome; //到浏览器默认主页 WebBrowser1.Refresh; //刷新 WebBrowser1.GoBack; //后退 WebBrowser1.GoForw ...

  5. WinForm中WebBrowser的使用

    最近由于工作需要,研究了下Winform的WebBrowser控件,在这里给大家分享下. 1.WebBrowser导航 WebBrowser在进行导航的时候需要用到Navigate(string ur ...

  6. C++(MFC)中WebBrowser去除3D边框的方法(实现IDocHostUIHandler接口)控制 WebBrowser 控件的外观和行为

    在 CSDN 上经常看到以下两个问题:1.在 MFC 应用程序中,如果创建了一个 WebBrowser 控件(包括 CHtmlView 在内),如何可以把该控件的三维边框禁止掉?2.在 MFC 应用程 ...

  7. Duilib中Webbrowser事件完善使其支持判断页面加载完毕

    在多iframe的页面中,需要结合DISPID_DOCUMENTCOMPLETE和DISPID_NAVIGATECOMPLETE2两个事件判断页面是否加载完毕,而duilib中没有提供对DISPID_ ...

  8. delphi中WEBBrowser网页html相互调用(一)

    1.基本操作1.1.激活 var doc,url:Olevariant ; begin url:='about:blank' ;//或者一个有实际意义的url WebBrowser1.Navigate ...

  9. c#中WebBrowser控件的使用方法

    首先先来简单介绍一下webbrowser控件,这个控件是可以实现在form窗体中添加网页内容的.如图,我在form中加入了百度api,(百度地图api调用博客里有讲) 使用这个控件其实很简单 (1)第 ...

随机推荐

  1. 【Android基础】listview控件的使用(3)------Map与SimpleAdapter组成的多显示条目的Listview

    前面介绍的两种listview的使用都是最基础的,所以有很大的局限性,比如只能在一个item(即每一行的条目)中显示一个文本信息,这一篇我将介绍Map与SimpleAdapter组成的多显示条目的Li ...

  2. OOA/OOD/OOP(转)

    OOA Object-Oriented Analysis:面向对象分析方法 是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题.OOA与结构化分析有较大的区别.OOA所强调的 ...

  3. 关于苹果公司最新的语言Swift

    Swift供IOS和OSX新的编程语言开发的应用程序,吸取C和Objective-C质朴的语言.但没有损失C兼容性语言.Swift使用安全的编程模型.增加各种现代编程语言功能,使语言更容易掌握.更具可 ...

  4. iOS_20_微博的骨架结构

    最后效果图: BeyondViewController.m // // BeyondViewController.m // 20_帅哥no微博 // // Created by beyond on 1 ...

  5. MemberwishClone学习

    /* * Created by SharpDevelop. * User: My little flower basket * Date: 2013/7/12 * Time: 9:37 * * To ...

  6. js 性能优化整理之 惰性载入

    跨检查浏览器特性,解决不同浏览器的兼容问题. 例如,我们最常见的为 dom 节点添加事件的函数 function addEvent(element,type,handler){ if(element. ...

  7. Maven工程引入jar包(转)

    Maven项目引入jar包的方法,希望能帮助有需要的朋友们 法一.手动导入:项目右键—>Build Path—>Configure Build Path—>选中Libraries—& ...

  8. 使用方便 正则表达式grep,sed,awk(一)

    一些无稽之谈: 对于正则表达式,永远似了解不明白,看到一些代码,脚本定期,awk,sed.心里总有点虚.主要是记不住.平时又没怎么用,也就没总结了. 如今有空,决定总结一下,顺便克服一下看到shell ...

  9. React JS高速新手教程

    翻译至官方文档<Tutorial>http://facebook.github.io/react/docs/tutorial.html 转载请注明出处:http://blog.csdn.n ...

  10. Spring 5 (0) - Introduction & Index

    Spring Framework Reference Documentation I. Overview of Spring Framework . Getting Started with Spri ...