C#中WebBrowser的使用
2024-07-21 02:27:23
供稿:网友
其实网络上这类文章很多,我大致从头说说我自己的经验。
1、加入引用
在控件栏按右键,选择“添加/移除项”,选com组件,选中“microsoft web browser”。然后就可以往窗体上拖出一个该控件(下面把该控件一个对象称为webbrowser)。控件属性中可以调整的不多,从一些资料中得知webbrowser中的menubar、statusbar等其实都没实现。
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;
相当用于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" );
暂时就这样,比较常用的也就是这些了。其它的就让我们在继续使用中慢慢琢磨体会吧。