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的使用的更多相关文章
- C#中WebBrowser控件的使用
今天在YouTube上看了一个关于WebBrowser控件用法的小视频,做一下总结. 首先创建一个WinForm程序,拖入一个textbox控件和一个button按钮,然后拖入一个panel控件,如图 ...
- 通过批处理操作注册表实现winform应用中Webbrowser以指定的IE版本加载网页
通过批处理操作注册表实现winform应用中Webbrowser以指定的IE版本加载网页 rem 强制WebBrowser控件使用指定IE版本显示应用的网页 IF EXIST %windir%\Sys ...
- Delphi中WebBrowser控件打开部分网站报"Invalid floating point operation”解决
Delphi中WebBrowser控件打开部分网站报"Invalid floating point operation”解决 EmbeddedWBWebBrowserDelphi 最近用E ...
- delphi中webbrowser的用法
WebBrowser1.GoHome; //到浏览器默认主页 WebBrowser1.Refresh; //刷新 WebBrowser1.GoBack; //后退 WebBrowser1.GoForw ...
- WinForm中WebBrowser的使用
最近由于工作需要,研究了下Winform的WebBrowser控件,在这里给大家分享下. 1.WebBrowser导航 WebBrowser在进行导航的时候需要用到Navigate(string ur ...
- C++(MFC)中WebBrowser去除3D边框的方法(实现IDocHostUIHandler接口)控制 WebBrowser 控件的外观和行为
在 CSDN 上经常看到以下两个问题:1.在 MFC 应用程序中,如果创建了一个 WebBrowser 控件(包括 CHtmlView 在内),如何可以把该控件的三维边框禁止掉?2.在 MFC 应用程 ...
- Duilib中Webbrowser事件完善使其支持判断页面加载完毕
在多iframe的页面中,需要结合DISPID_DOCUMENTCOMPLETE和DISPID_NAVIGATECOMPLETE2两个事件判断页面是否加载完毕,而duilib中没有提供对DISPID_ ...
- delphi中WEBBrowser网页html相互调用(一)
1.基本操作1.1.激活 var doc,url:Olevariant ; begin url:='about:blank' ;//或者一个有实际意义的url WebBrowser1.Navigate ...
- c#中WebBrowser控件的使用方法
首先先来简单介绍一下webbrowser控件,这个控件是可以实现在form窗体中添加网页内容的.如图,我在form中加入了百度api,(百度地图api调用博客里有讲) 使用这个控件其实很简单 (1)第 ...
随机推荐
- Java就业前景怎么样?学了后好找工作吗?
不知道大家对Java就业前景了解多少.随着信息化的发展.IT培训受倒了越来越多人的追捧.在开发领域,JAVA培训成为了很多人的首选!JAVA应用广泛.JAVA培训就业前景良好. 眼下.尽管JAVA人才 ...
- charles抓包
charles使用教程指南 charles使用教程指南 前言 移动APP抓包 PC端抓包 查看模式 其他功能 问题汇总 1. 前言: Charles是一款抓包修改工具,相比起burp,charles具 ...
- MMTool制作Ozmosis引导BIOS完美引导OS X系统
Ozmosis引导是德国黑苹果爱好者制作的一个引导程序,目前仍处于测试版,有了它,你可以不用再使用四叶草.变色龙之类引导工具,相对而言它更象白苹果.Ozmosis是基于AMI公司bios的硬件引导驱动 ...
- OpenGL中shader使用
学了接近一个月的OpenGL,最终要排上用场了...好吧,就从学到的shader(着色器)开刀吧. 先简单的介绍shader,shader事实上是显卡的功能,就是利用显卡的GPU去做图像处理的工作,而 ...
- UVA 11464 Even Parity(递归枚举)
11464 - Even Parity Time limit: 3.000 seconds We have a grid of size N x N. Each cell of the grid in ...
- 国外流行的共享网站实现:facebook,twitter,google+1,tumblr等待
近期需要做相关的国外几个站点共享,本来我以为它会和weibo.在同样的烦恼空间,什么appkey啦,apptoken啦.api啦.结果非常意外的发现并非如此恼火. Twitter分享: https:/ ...
- Linux 常用命令汇总
1.shutdown -s 时间 如果是想马上关机就直接输入0或者now: 2.init 0 这个是运行级别关机: 3.halt 这个命令不是很好用: 4.power off 这个命令也是很好用的. ...
- Spring AOP在pointcut expression解析表达式 并匹配多个条件
Pointcut 方法是那些需要运行"AOP",由"Pointcut Expression"为了描述叙事. Pointcut以下方法可以通过定义任&&a ...
- 【日常学习】【欧拉功能】codevs2296 荣誉的解决方案卫队的一个问题
转载请注明出处 [ametake版权全部]http://blog.csdn.net/ametake欢迎来看看 题目来源:SDOI2008 文章被剽窃非常严重啊 所以以后都带上版权信息 先上题目 题目描 ...
- crontab演出newLISP脚本设置环境变量
今天遇到一个问题.执行在终端newLISP文字,一切正常,搬去crontab在将无法正常工作.即使crontab -e命令是在同一个用户执行.还是有问题. 因为newLISP脚本使用hive和hado ...