我用WinForm开发也有一段时间了。我觉得目前的WinForm开发速度是够的,但是一些原本在HTML就很容易做到的事情,在WinForm中就很难实现了。 这个主要的原因可能是WinForm复用控件的能力非常强,但是可用的控件却非常少。一般买回来的控件不但贵,而且也不是太好扩展。
作为一个学了多年HTML的人,我当然希望在WinForm中依然能使用HTML的特征,例如强大的CSS!,自动排版伸缩的特征,(CSS与排版可以更方便打印!),以及脚本的编写。(有时候写脚本比写WinForm的程序更爽。具体情况具体做)。
要做这个其实不难。但是要灵活运用则不容易了。
通常,使用WebBrowser控件的人,只是简单地使用MSHTML调用WebBrowser里的东西。也就是说,这个调用是单项的,只考虑到修改HTML来显示某种东西。
今天我写这个随笔的意图是告诉大家怎样把用户在WebBrowser里的操作反馈给WinForm 。
做这个反馈的基石是 DotNet 的 InteropServices 。通过把DotNet的某个对象,传到HTML DOM里去,然后用脚本来操作该DotNet对象。
要做到这个,核心是:
- 获取 WebBrowser.Document ,它实现了mshtml.IHtmlDocument /2/3/4/5 (其中IHtmlDocument2最有用)
- 这个Document是 System.Runtime.InteropServices.Expando.IExpando,通过它来设置和获取Document的一些动态命名的成员。
例子中的代码是:
mshtml.IHTMLDocument2 doc2=(mshtml.IHTMLDocument2)browser.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);//从此,在HTML的document.Form1就是这个WinForm的Control了。你可以用脚本来调用Form1 !
有了这些交互,我们可以实现的东西实在太多太多了。
我做了一个简单的例子,在这里下载 http://www.lostinet.com/files/WinHtml.zip
我下一步应该是研究一下,怎样直接把WinForm的Control动态地嵌进这个HTML里。(不是用 《 OBJECT 》来部署的形式)
打印 | 张贴于 2004-06-04 11:26:00 | Tag:DotNet Browser WinForm
留言反馈
给我呀?正需要~~~先谢谢
jacky_lz@163.com
楼主现在正弄webbroswer能发给我一份吗?
jindongbin@gmail.com
谢谢
可以向您要一份code 看看嗎 謝謝
zuo.li@hotmail.com
.net中我用了一个WebBrowser控件打开一个网页,模拟提交了表单,但返回的页面在一个新弹出来的(IE)窗口中。后来,在程序中,我设置了表单的targer属性为“_self”后新网页就没了,原窗口不变。
但我想控制模拟操作所返回的信息(或对象)以便进用程序在其返回的网页中行进一步操作,有没有办法将返回信息存入WebBrowser中?或者,我怎样才能控制这个返回的结果?
Try the following:
mshtml.IHTMLDocument2 doc2=(mshtml.IHTMLDocument2)browser.Document.DomDocument;
public partial class Form1 : Form, IElementBehaviorFactory
luozhanke@163.com
邮箱:liulei.sh@gmail.com
非常感谢!
sofor@netease.com
謝謝!!!
yarlker@163.com
万分感谢
谢谢.
yangyong9842@163.com
再次谢谢!!!
qi_cheng@tom.com
在代码里直接写mshtml.IHTMLDocument2 是报错的
是不是要using *****
Hr520@sohu.com
跪谢!
我正做相关的内容,可以给我一份Demo吗?
qfgetletter@yahoo.com.cn
非常感谢!
zds1882121@163.com
zjbtony@yahoo.com.cn
cenxaoi@163.com
ziqing1980@163.com
tessalee1226@hotmail.com
感激不盡啊!!!
万分感谢!
xgr2423@163.com
139265822@qq.com
能发我一份吗?
design_room@163.com
zjbtony@yahoo.com.cn
谢谢了
asyura@126.com
谢谢
swxing@msn.com
recall2k@sina.com
Email:zmdstone007@163.com
EMail:unicheer@163.Com
bj_qwy@126.com
另外请加我的QQ,我可以帮你提供下载:172527
EMail:xuyi7208@163.com
EMail:yqken@163.Com
你的Demo下载不了啦,能Mail给我一份吗?谢谢了
EMail:yuanshunli@vip.sina.com
谢谢!!!!!!
lp@nmec.org.cn
多谢。
我正做相关的内容,可以给我一份Demo吗?
honglou2001@163.com
谢谢!
wangrh_liuyh@tom.com
多谢。
谢谢。
问作者该怎么解决,谢谢
很感兴趣.
奈何看不懂撒...55555555555555
不知道又没有用.net实现的WebBrowser
我用MSN客户端发起对话,输入1000次短信,MYIM丫的就死掉了
用IE来做界面可以比较方便的实现很炫目的效果,但有时在控制方面还是觉不理想的.
要不段地用Expando来把它装上。
public void Test(string strValue)
{
textBox1.Text=strValue;
}
按照你提供的方法修改还是提示错误!!(两种方法都出错)
如果你是在我的例子的基础上改的,那么出现这个问题的最可能的原因是 textBox1 是 private 的。
如果作为public的property,则会更好
例如
public TextBox TextBox1
{
get
{
return textBox1;
}
}
吼吼~~
学习学习 再学习~
因为很多人都知道怎样在Windows程序中嵌IE。
如果HTML只是纯粹通过HTTP和服务器进行交互,那就是B/S了
而我这里则是希望用WinForm嵌IE的形式,
并且提供“服务”给网页中的脚本调用。
例如Form1的权限,可以读本地文件,可以跨域名访问其他网站的WebService,可以用WinForm作为代理,操作其他跨域的FRAME,又或者是修改用户打印的设置等。
原本DHTML无权做的,或者不能做的,现在都可以委托WinForm来做了。
而DHTML的主要作用就是提供界面和运行一些更胶水的脚本。
上次做了个东西用WebBrowser 在我本地好好的 放到服务器上就出不行了(类 win服务的东西)
很好
非常好
真的可以做些让别人奇怪的事了 哈哈
偶喜翻 偶b/s的时间比较长 想不到这个东西有可能让我挂着做c/s的旗子做b/s的事 哇 哈哈~~~
大锅继续研究~~
关注中。。。。。。。。。。。。
因为我发现了
IHTMLDocument2.parentWindow