by 清泉
30. 八月 2011 00:16
早上在博客园上面一篇文章中看到在说WinForm中用WebBrowser套入网页,然后在网页中去调用Winform中的方法,感觉挺有意思的,于是找了点资料,了解了一下WinForm中使用WebBrowser的情况下如何实现C#和JS的通信,简单说就是WinForm中如何用C#去调用WebBrowser所指向的网页中的JS代码(一般是某个方法);反过来,一个被WebBrowser所指向的网页中要怎么去调用WinForm中的方法。
1、首先看下在Winform中调用WebBrowser中网页的JS。在网页上提供了两个JS方法,如下
javascript代码
// 给Winform调用的方法
function ShowAlert(msg) {
alert(msg);
}
// 给Winform调用的方法
function ShowMsg(msg){
document.getElementById("Text1").value = msg;
}
下面是WinForm中调用这两个方法的代码,我使用了两个按钮,在他们的点击事件中分别调用了这两个方法(注:webBrowser1是我拉进窗体中的WebBrowser对象名)
c#代码
private void btn_ShowAlert_Click(object sender, EventArgs e){
this.webBrowser1.Document.InvokeScript("ShowAlert",new object[] { this.txb_Msg.Text });
}
private void btn_ShowMsg_Click(object sender, EventArgs e) {
this.webBrowser1.Document.InvokeScript("ShowMsg",new object[] { this.txb_Msg.Text });
}
可以看到,这里用了WebBrowser的Document提供的InvokeScript方法,这个方法有两个重载,都是要接收一个叫做scriptName的string参数,这里可以理解为“JS的方法名”,其中的一个重载接受多一个名为args的object[]参数,很明显,这个是给JS方法传参用的。
2、接下来是在网页中调用WinForm方法,这个就相对复杂一点,有两个要点,如下:
1)设置WebBrowser的ObjectForScripting属性,这个属性用于获取或设置一个对象,该对象可由显示在WebBrowser控件中的网页所包含的脚本代码访问,一般我们是把WebBrowser所在的窗体对象给赋过去(即this)。关于ObjectForScripting属性,详见msdn:http://msdn.microsoft.com/zh-cn/library/system.windows.forms.webbrowser.objectforscripting(v=vs.80).aspx
2)设置窗体类的ComVisibleAttribute(在System.Runtime.InteropServices命名空间下),将其设置为true,即[ComVisible(true)],如此这样窗体就被设置为com可访问。关于ComVisibleAttribute类,详见msdn:http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.comvisibleattribute(v=vs.80).aspx
完成以上两部分工作后,我们要做的就是在窗体类中编写方法来给JS调用了,我们编写两个方法,和上面的js方法类似,一个是弹出MessageBox显示点东西,一个是在窗体上的文本框中显示点东西,如下:
c#代码
/// <summary>
/// 给WebBrowser中Web的JS调用的方法
/// </summary>
/// <param name="msg"></param>
public void MsgBox(string msg) {
MessageBox.Show(msg);
}
/// <summary>
/// 给WebBrowser中Web的JS调用的方法
/// </summary>
/// <param name="msg"></param>
public void ShowMsg(string msg) {
this.txb_Msg.Text = msg;
}
接下来就是在Web页面上面编写JS来调用这两个方法了(注:这个Web页面是套在该窗体的WebBrowser中),同样也是用两个按钮,分别调用两个方法(注:Text1是页面上的一个文本框)
javascript代码
// 调用外部方法,在WinForm程序中用MessageBox显示文本框输入值
function On_Button1_Click() {
var msg = document.getElementById("Text1").value;
window.external.MsgBox(msg);
}
//调用外部方法,在WinForm查询中显示文本框输入值
function On_Button2_Click() {
var msg = document.getElementById("Text1").value;
window.external.ShowMsg(msg);
}
可以看到这里调用了window对象中的一个叫做external的对象,通过这个对象去访问到外部方法(也就是WinForm中提供的public方法了)。
