WinForm中实现JS和C#的相互调用

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方法了)。 

Tags:

DotNet技术资料

添加评论



(将显示你的Gravatar头像)  

biuquote
微笑得意调皮害羞酷大笑惊讶发呆喜欢可怜尴尬闭嘴噘嘴皱眉伤心抓狂呕吐坏笑漫骂发怒
Loading



Supidea.com 晨飞的梦 @ All Rights Reserved. Powered by BlogYi.NET ver:1.8.0.0. 苏ICP备09011404号

关于博主

kamau
抱着美好的理想背井离乡,这酸甜苦辣只能默默忍受。既然选择了路,就得风雨兼程……

Calendar

<<  二月 2012  >>
303112345
6789101112
13141516171819
20212223242526
2728291234
567891011

在日历中查看文章

最近的评论

Comment RSS

声明

      本博所发一切破解相关附件只作学习研究交流之用,严禁用于商业用途,请在下载24小时内删除。
      本博所有网友评论不代表本博立场,版权归其作者所有。

© Copyright 2009