惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
DataBreaches.Net
L
LangChain Blog
博客园_首页
J
Java Code Geeks
博客园 - 【当耐特】
Microsoft Azure Blog
Microsoft Azure Blog
小众软件
小众软件
WordPress大学
WordPress大学
V
Visual Studio Blog
T
The Blog of Author Tim Ferriss
U
Unit 42
酷 壳 – CoolShell
酷 壳 – CoolShell
Recent Announcements
Recent Announcements
C
Check Point Blog
IT之家
IT之家
Engineering at Meta
Engineering at Meta
N
Netflix TechBlog - Medium
A
About on SuperTechFans
aimingoo的专栏
aimingoo的专栏
D
Docker
有赞技术团队
有赞技术团队
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
阮一峰的网络日志
阮一峰的网络日志
I
InfoQ

博客园 - coffeeliu

09论文资料 DataGridViewCheckBoxCell扩展 2008毕业设计问题汇总 警惕股市房市拉大贫富差距 毕业设计2稿评述 2007实训指导书 5.18请将毕业设计论文电子稿发给我 2007毕业设计模版 2007毕业设计任务书下载 oracle 游标(学校) vs2005 快捷代码小片段 (oracle)九、安全(一) 可口可乐和百事可乐查出杀虫剂成分! (oracle)八、表 (oracle)七、OEM概述 (oracle)六、卸载oracle (oracle)五、oracle软体结构 (oracle)四、存储结构 (oracle)三、启动关闭数据库
vs2008 webbrowser 与网页双向通信的方法
coffeeliu · 2010-03-06 · via 博客园 - coffeeliu

现在很多软件都做成了内嵌浏览器的形式,vs2008中的webbrwser控件即可以实现此功能。当然不能说2008中的webbrowser是个新东西,他只不过将以前的msthml做了一次不完全封装。姑且不论其封装的如何,至少我们在使用它时不需要向以前一样频繁的调用令人讨厌的IHTMLDocument、IHTMLDocument2、IHTMLDocument3、IHTMLDocument4..........而且新版的webbrowser是线程安全的!这点最重要。

以下代码片段均摘自我的一个项目。

1.下面看看webbrowser如何调用调用页面里的Javascript:

C#段:

代码

void ShowTable(string sid) {
            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});
                }
            }
        
        }

去掉干扰代码其实最关键的代码是:

webBrowser1.Document.InvokeScript(s, new String[] { tag});

JavaScript段:

   function Showdisplay(id) {if (document.getElementById(id)) {
           
var traget = document.getElementById(id);
           traget.style.display 
= "";
       }
   }

上面的代码实现了在C#程序中输入页面的ID号,页面中的对应ID的元素显示功能。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

2.JavaScript调用C#程序

反向调用有点小步骤

  a.C#代码段让JavaScript能够看见接口

[ComVisible(true)]   //com接口可见
    public partial class FormPD : Form
    {
...............
}

  b.C#代码段让寄宿的脚本能够访问

private void FormPD_Load(object sender, EventArgs e)
{
    webBrowser1.ObjectForScripting 
= this;
}

当然你也可以把 webBrowser1.ObjectForScripting = this; 写在窗口初始化代码里。
 c.JavaScript和网页的相关代码

代码

<script type="text/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#代码段

代码

public void ShowPrint(string fromname,string selecthtmltext)
    {
        
//"实时数据",t
        FormSavePrint f = new FormSavePrint("实时数据",selecthtmltext);
         f.MdiParent 
= formmain;
         f.Show();
    }

OK!上面可以实现当鼠标选中网页的某些区域时,此区域的页面代码被传入到C#程序的新窗口中。

总体说来比以前的mshtml使用要方便多了

posted on 2010-03-06 09:52  coffeeliu  阅读(1107)  评论()    收藏  举报