原文: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)

最新文章

  1. linux自用命令
  2. git-tag
  3. Oracle 监听器日志文件过大导致监听异常
  4. 转:vs发布window应用程序时出错:未能签名 ...\setup.exe
  5. Nhibernate Icreteria 分页查询
  6. WPF学习之资源-Resources
  7. jquery创建动态的div
  8. 小米笔记本怎么关闭secure boot
  9. tab切换的效果——仿照今日头条APP的切换效果
  10. mission 01
  11. 详解如何进行第三方App接入微信登录
  12. SharePoint Online 自定义Modern UI表单
  13. TIC Read Status此类网络活动提醒隐藏
  14. POJ 1144 Network(tarjan 求割点个数)
  15. node下的跨域传递cookie
  16. Python3.6(windows系统)安装pip.whl
  17. 浅谈javascript函数,变量声明及作用域
  18. 响应式下的雪碧图解决方案 - 活用background-size / background-position
  19. nodejs 聊天室简单实现
  20. python数据分析工具安装集合

热门文章

  1. Swift学习笔记7:关闭
  2. 【原创】构建高性能ASP.NET站点 开篇
  3. B/S VS C/S
  4. PowerShell 批量导入/导出Active Directory
  5. HDN2048(交错复发)
  6. JTree
  7. 博客搬到了http://xianglong.me
  8. 如何安装一个优秀的BUG管理平台(转)
  9. POJ 3979 分数减法【数学问题的探讨】
  10. 编程算法 - 圆圈中最后剩下的数字(循环链表) 代码(C++)