现在很多软件都做成了内嵌浏览器的形式,vs2008中的webbrwser控件即可以实现此功能。当然不能说2008中的webbrowser是个新东西,他只不过将以前的msthml做了一次不完全封装。姑且不论其封装的如何,至少我们在使用它时不需要向以前一样频繁的调用令人讨厌的IHTMLDocument、IHTMLDocument2、IHTMLDocument3、IHTMLDocument4..........而且新版的webbrowser是线程安全的!这点最重要。
以下代码片段均摘自我的一个项目。
1.下面看看webbrowser如何调用调用页面里的Javascript:
C#段:
SetWebBorserSafe(webBrowser1, "Showdisplay", sid);
}
public void SetWebBorserSafe(object o,string s,string tag)//保证线程安全
{
if (o == webBrowser1)
{
if (this.webBrowser1.InvokeRequired)
{
BeginInvoke(new SetWebBroserCallback(SetWebBorserSafe), new object[] { webBrowser1, s, tag });
}
else
{
webBrowser1.Document.InvokeScript(s, new String[] { tag});
}
}
}
去掉干扰代码其实最关键的代码是:
JavaScript段:
if (document.getElementById(id)) {
var traget = document.getElementById(id);
traget.style.display = "";
}
}
上面的代码实现了在C#程序中输入页面的ID号,页面中的对应ID的元素显示功能。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2.JavaScript调用C#程序
反向调用有点小步骤
a.C#代码段让JavaScript能够看见接口
public partial class FormPD : Form
{
...............
}
b.C#代码段让寄宿的脚本能够访问
{
webBrowser1.ObjectForScripting = this;
}
当然你也可以把 webBrowser1.ObjectForScripting = this; 写在窗口初始化代码里。
c.JavaScript和网页的相关代码
function getSel() {
var t="";
t= window.getSelection ? window.getSelection() : (document.getSelection ? document.getSelection() : (document.selection ? document.selection.createRange().Text : ""))
window.external.ShowPrint("实时数据",t);
}
</script>
<body onmouseup="getSel()">
关键代码: window.external.ShowPrint("实时数据",t);
d.C#代码段
{
//"实时数据",t
FormSavePrint f = new FormSavePrint("实时数据",selecthtmltext);
f.MdiParent = formmain;
f.Show();
}
OK!上面可以实现当鼠标选中网页的某些区域时,此区域的页面代码被传入到C#程序的新窗口中。
总体说来比以前的mshtml使用要方便多了